如何在使用“delims =”作为扩展列表时将搜索目录包含到 FOR-DO 循环中

Posted

技术标签:

【中文标题】如何在使用“delims =”作为扩展列表时将搜索目录包含到 FOR-DO 循环中【英文标题】:How to include search directory into FOR-DO loop while using "delims=" for a list of extensions 【发布时间】:2021-09-02 16:47:41 【问题描述】:

在 Windows 10 中,通过批处理,我想包含要搜索文件扩展名列表的目录;并处理该文件夹中具有特定扩展名的文件。

我有一个批处理文件,我将一个文件夹拖放到它上面(或其快捷方式)以调用批处理。 因此,文件夹路径作为 %1 参数/参数传递给批处理文件。 我的需要与传递文件等无关;多个文件夹;该文件夹中是否有子目录...作为参数。

我需要帮助的批次部分如下:

PUSHD %1
REM or by CD %1
FOR /F "delims=" %%I in ('dir /A-D /B *.tif *.jpg 2^>NUL') DO (
REM or by, though unwanted: FOR /F "delims=" %%I in ('dir /A-D /B %1\*.tif %1\*.jpg 2^>NUL') DO (
REM  CALL :DOSOMETHING "with %~dpnx1\%%I and other arguments"
)

正如在代码中看到的那样,我可以使用PUSHD 该目录或@987654323 在文件夹 %1 中使用 TIF 和 JPG 扩展名成功对/处理文件@ 到那个目录。或者通过省略 PUSHD 和 CD;并在列表中的分隔符前添加/更改%1\*.TIF 等。一切正常。但我想使用一种优雅的方法来执行此操作。但不是通过查找文件中的%1\*.EXTENSION 列表。 相反,将 %1 包含在 FOR 行中 FOR( 之间的某处(左括号)。 可能吗?如果有,请问怎么做?我确实阅读了一些 RTFM,但无法理解是否有任何帮助。我也做了一些尝试和错误的组合,但无济于事。

你可能会说没有必要使用"%~dpnx1\%%I"而只使用"%%I",因为使用了PUSHD/CD,在批处理文件中会一直做同样的事情,但我想摆脱PUSHD /CD 如果可能的话。

另外一点,如果问一个不相关的问题是合适的...... 虽然我没有在"delims=" 中使用usebackq 选项,和/或我没有在双引号中使用%1(仅限%1,而不是"%1"),但代码都能够成功执行带空格的目录和文件名。请问为什么?

【问题讨论】:

我个人认为这是一个糟糕的编码选择。通过将 dir 命令与传递的目录参数一起使用,FOR 命令不知道它获取文件的目录,如果您不首先使用 pushd,则每次需要引用该文件时,强制您使用 %1。跨度> "... FOR 命令不知道它从中获取文件的目录..." 这正是我在代码中不喜欢的地方。我没能像你那样表达。是的,@Squashman,你是对的。我想增强那部分代码。 【参考方案1】:

如果使用Dir 命令以外的东西呢?例如Robocopy:

For /F "Tokens=*" %%G In ('%SystemRoot%\System32\Robocopy.exe %1 NULL
 *.tif *.jpg
 /L /NC /NDL /NJH /NJS /NS 2^>NUL'
) Do Call :DOSOMETHING "with %%G and other arguments"

请注意,虽然这在技术上是一个单行命令,但我已将其拆分为一个完全有效但更易读且易于修改的布局。只需在第二行替换您的扩展 glob 列表,或根据需要添加到它们中。

我使用了%1 变量来表示您拖放的目录。虽然"%~1" 通常可以说更健壮,但您的特定情况不需要它,因为如果需要,GUI 拖放会自动对目录进行双引号。

【讨论】:

"使用 Dir 命令以外的东西怎么样?例如 Robocopy" 我能说什么 @Compo ?迷人的!我永远不会想到使用 Robocopy。谢谢你。当我之前进行“在批处理文件中使用文件列表”或“在批处理文件中使用具有特定扩展名的文件”类型的搜索时,我发现的只是使用 dir /A-D /B 。虽然我需要一个能够分别定义“查找文件的目录”和“具有特定扩展名的文件”的命令。我会试试你的提议,我认为这会解决我的问题。我会尽快发布。

以上是关于如何在使用“delims =”作为扩展列表时将搜索目录包含到 FOR-DO 循环中的主要内容,如果未能解决你的问题,请参考以下文章

如何在选择时将 UICollectionView 单元格扩展到屏幕的宽度?

批处理Delims的基本知识

在表中插入记录时将所选值作为城市下拉列表的空值

bat 脚本 for /f "delims=", delims的使用

在 Flutter 中按下按钮时将新的小部件作为列表插入

如何在Flutter(2021)中创建过滤器搜索列表视图