1

这是似乎变得更加复杂的要求之一,每次我发现需要“解决”的 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)。

结果既令人惊讶又令人沮丧。这是在控制台命令行上使用此 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在标签:< 2 > 和一个谜在标签:< 1 >。我应该解释一下我认为的DIR开关。

  • / b ....... 裸格式,只是文件/文件夹名称。
  • /a dh ..... 隐藏和目录,都试过了——没用。
    /一个高清
  • /a d ...... 具有 Directory 属性的项目(文件夹)。
  • / ah ......隐藏文件/文件夹(看似)。

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

  1. “找不到文件”.. .. .. .. .. .. .. .. 我不知道。我发现“找不到文件”。< 1 > 是/ah开关的产物。当我只是说:
    IN ( dir /b /adh "w:\sandbox\tmp\")
  2. C:\WINDOWS\system32**cmd.exe** .. .. 虚假迭代器 ( %%f ); 此错误仅在FOR /F命令版本中显示。我想找到隐藏目录,文件集列表不返回隐藏文件(d'oh)。所以,到目前为止,我坚持使用FOR /F的usebackq版本。
  3. 隐藏文件夹... .. .. .. .. .. .. 这些文件夹是预期的输出_。
  4. 目录文件夹。.. .. .. .. .. .. 这些文件是虚假的结果,而不是想要的。

CMD 行版本(或示例 DOS 脚本)的预期结果只是 < 3 > 项。

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 命令一样遍历列表?

在此先感谢/将

4

2 回答 2

2

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

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

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

于 2010-01-16T15:19:01.023 回答
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

于 2011-04-28T08:13:38.230 回答