FOR / F循环中的虚假'system \ cmd.exe'

时间:2010-01-16 13:13:41

标签: windows for-loop hidden cmd

这是其中一个似乎变得更复杂的要求,每当我发现需要“解决”的Windows / cmd shell hack时。基本上......我需要遍历DOS Shell FOR循环中的特定文件夹列表。这是我提出的循环:

 echo  ^ [start for test]
 for  /F "usebackq "  %%f IN (`dir /b /adh "w:\sandbox\tmp\"`)  DO (
    echo ^    do with file: %%f
    rem  <do something>
 )
echo  ^ [for test done]

主要需要遍历源文件夹中的隐藏目录(sandbox \ tmp here)。

结果既令人惊讶又令人沮丧。这是在控制台命令行上使用此FOR指令的结果。

W:..> for  /F "usebackq "  %f 
              IN (`dir /b /adh "w:\sandbox\tmp\"`)  DO echo ^ folder = %f
File Not Found                                <1>
  folder = C:\WINDOWS\system32\cmd.exe        <2>
  folder = any                                <4>
  folder = hidden-folder-01                   <3>
  folder = hidden-folder-02                   <3>
  folder = morph                              <4>
  folder = practice-northwind                 <4>

其中列出了五个文件夹。大!标签上有一个 cmd.exe :&lt; 2 &gt;标签上的一个谜:&lt; 1 &gt;。我应该解释一下我认为的 DIR 开关。

  • / b .......裸格式,只是文件/文件夹名称。
  • / a dh .....无论是隐藏还是目录,都尝试过彻底 - 没有用。
    / hd
  • / a d ......具有目录属性(文件夹)的项目。
  • / a h ......隐藏文件/文件夹(貌似)。

我已经标注了输出,这是我到目前为止所做的工作。

  1. '找不到文件'.. .. .. .. .. .. .. ..我不知道。我发现“找不到文件”。 &LT;的 1 &GT;是 / ah 开关的人工制品。当我只说:
    IN(dir /b /adh "w:\sandbox\tmp\"
  2. C:\ WINDOWS \ system32 ** cmd.exe ** .. ..虚假迭代器( %% f );此错误仅显示 FOR / F 命令版本。我想找到隐藏的目录,文件集列表不会返回隐藏文件(d'oh)。所以,到目前为止,我仍然坚持 FOR / F usebackq 版本。
  3. 隐藏文件夹.. .. .. .. .. .. ..这些文件夹是 预期 输出 _。
  4. 目录文件夹。 .. .. .. .. .. ..这些文件是虚假的结果,不想要。
  5. CMD行版本(或示例DOS脚本)的预期结果只是&lt; 3 &gt;项目

    W:..> for  /F "usebackq "  %f 
                  IN (`dir /b /adh "w:\sandbox\tmp\"`)  DO echo ^ folder = %f
      folder = hidden-folder-01                   <3>
      folder = hidden-folder-02                   <3>
    

    不幸的是,我'只能'获取目标文件夹中的任何文件。我认为这又与HIDDEN开关(/ ah)有关。

    如何仅列出设置目录中的隐藏文件夹(而不是文件);并像FOR命令一样迭代列表?

    提前致谢/ Will

2 个答案:

答案 0 :(得分:2)

在批处理文件中,dir /b /a dh "w:\sandbox\tmp\"应为dir /b /adh "w:\sandbox\tmp\",/ a和dh之间没有空格。使用空格,dir命令将dh解释为目录或文件paremer,并且是找不到文件错误的原因。

当您从命令行运行时,您正在使用与dir命令dir /b /ah /ad "w:\sandbox\tmp\"不同的参数,因此您将获得不同的输出。使用/ ah和/ ad作为单独的参数dir似乎解释它应该显示目录或隐藏文件的东西,而/ adh将显示同时是目录和隐藏的东西。

此外,您不需要在所有线路上使用@。只是@echo在文件的顶部关闭,这将禁用整个批处理文件的命令回显。

答案 1 :(得分:1)

你应该使用

for  /F "usebackq delims=*"  %f IN (`"dir /b /adh "%1" 2>NUL"`)  DO @echo. folder = "%f"

去做。

2>NUL

将确保未显示错误通道(例如,未找到文件)并指向NULL(NUL)

delims=*
如果文件名有空格,

将确保脚本也能正常工作,因为文件名不能包含“*”,我们会找到它们全部!

我希望这对你有用,对我有用。

如果您的身边发生变化,我希望得到反馈,如果您不使用%f但使用%a,我知道为什么您的输出中会出现以下行

folder = C:\WINDOWS\system32\cmd.exe        <2>

电贺 PCFreak