findstr“ ^”如何等于一个空目录?

时间:2019-05-26 18:40:37

标签: windows batch-file command-line directory is-empty

Windows中的批处理文件在最佳情况下可能会令人困惑。

  findstr "^"

等于找到一个空文件夹,当^表示行的开头时?

for /d /r %1 %%A in (.) do (
  dir /ad /b "%%~fA" 2>nul | findstr "^" >nul || echo %%~fA
)

取自dbenham's answer

除非我读错了它,否则

dir /ad /b "%%~fA" 2>nul

找到空文件夹。

2 个答案:

答案 0 :(得分:3)

此脚本将获取目录(及其子目录)的列表,遍历每个目录以检查子目录,然后仅列出不包含子目录的目录名称。提供的链接中的原始脚本的工作原理类似,只是它仅列出完全个空目录(不包含子目录文件)。这是代码各部分的细分:


您的示例中的for /d正在获得目录的递归列表:

for /d /r %1 %%A in (.) do ( )
  • for /d遍历指定的目录集
  • for /d /r告诉for循环递归到子目录
  • %1 是从命令行指定的可选文件路径
  • %% A 将在每个循环中返回当前目录
  • (SET)中的
  • 指定要循环通过的目录
  • 在“(。)中指定“ ”告诉for遍历所有目录

然后,for循环中的代码将检查每个目录是否为空*:

  dir /ad /b "%%~fA" 2>nul | findstr "^" >nul || echo %%~fA
  • dir /ad /b "PATH" 获取指定路径中的子目录列表*
  • %%~fA ”将当前目录名称扩展为其完整路径
  • 2>nul 通过将STDERR重定向到nul隐藏所有dir错误
  • | dir找到的子目录列表通过管道传输到findstr
  • findstr "^" ,然后检查子目录的非空列表
  • >nul 通过将所有输出重定向到nul来隐藏findstr结果
  • 如果前一个命令失败(没有findstr结果),
  • || 运行一个命令
  • 如果未找到子目录,
  • 回显%%〜fA 将返回目录名称*

*请注意:如 LotPings 所述,您提供的代码将产生与链接的示例不同的结果。 dir /a /b列出所有文件和目录,而dir /ad /b仅列出目录。这意味着您的脚本将列出所有不包含子目录的目录(但可能仍包含文件)。如果这是预期的行为,请忽略此注释。

编辑:进一步细分了 Ben Voigt 建议的上述命令列表。

答案 1 :(得分:2)

我相信您所缺少的是static PyObject* PyFastFile_do_concatenation(PyFastFile* self) { PyObject* hello = Py_BuildValue( "s", "Hello" ); PyObject* word = Py_BuildValue( "s", "word" ); // I am just guessing the `->value` property PyObject* hello_world = hello->value + word->value; hello_world; // return the `PyObject*` string `Hello word` } static PyObject* PyFastFile_do_substring(PyFastFile* self) { PyObject* hello = Py_BuildValue( "s", "Hello word" ); PyObject* hello_world = hello->value[5:]; hello_world; // return the `PyObject*` string `word` } static PyObject* PyFastFile_do_contains(PyFastFile* self) { PyObject* hello = Py_BuildValue( "s", "Hello word" ); if( "word" in hello->value ) { Py_BuildValue( "p", true ); // return the `PyObject*` boolean `true` } Py_BuildValue( "p", false ); // return the `PyObject*` boolean `false` } (逻辑或)操作。

只有在前面的命令失败时,它才会在命令之后运行。

知道这一点后,||不会寻找空目录将很有意义。由dir /ad /b "%%~fA" 2>nul | findstr "^" >nul生成的列表不为空时,表示成功。列表为空时失败。