如何摆脱扩展的“forfiles”变量中的双引号?

How to get rid of enclosing double-quotes in the expanded `forfiles` variables?

forfiles 命令建立了几个变量,由前导 @ 指示,其中 return 有关循环体当前迭代项的数据。

与迭代项的路径和名称相关的所有变量return "" 中包含的值。它们是:@file@fname@ext@path@relpath

那么:如何去掉封闭的双引号?


例如,下面的代码 returns 给定根目录中文本文件的相对路径:

forfiles /P "C:\root" /M "*.txt" /C "cmd /C echo @relpath"

假设 C:\root 包含两个文件 file1.txtfile2.txt,输出将是:

".\file1.txt"
".\file2.txt"

但是,我想要的文件列表没有周围的""

我正在开发 Windows 7 64 位。

一种方法是在 forfiles 中嵌套一个 for %I 循环并使用 %~I 扩展——在命令提示符 window 中使用此代码:

forfiles /P "C:\root" /M "*.txt" /C "cmd /Q /C for %I in (@relpath) do echo %~I"

要在批处理文件中使用该代码,您必须将 % 符号加倍:

forfiles /P "C:\root" /M "*.txt" /C "cmd /Q /C for %%I in (@relpath) do echo %%~I"

返回的文件列表将是(依赖于原始问题中的示例文件):

.\file1.txt
.\file2.txt

另一种变体是在初始的正文中嵌套另一个 forfiles,因为 forfiles 删除给定字符串中的(非转义)双引号,例如 [=23 之后的命令行=]:

forfiles /P "C:\root" /M "*.txt" /C "cmd /C forfiles /P @path\.. /M @file /C \"cmd /C echo @relpath\""

或者(双重内部 forfiles 是有意的,这解决了一个错误——参见 this post):

forfiles /P "C:\root" /M "*.txt" /C "forfiles forfiles /P @path\.. /M @file /C \"cmd /C echo @relpath\""

内层forfiles会枚举出恰好一项,也就是外层循环传过来的一项。由于 @relpath 在执行内部循环时已经展开,因此引号被删除,因为它们没有被转义。

所以返回的文件列表看起来像(再次从原始问题中获取样本文件):

.\file1.txt

.\file2.txt

行与行之间的额外换行符由 forfiles 生成。您可以使用重定向来避免这种情况(关闭 forfiles 输出,但仅在控制台 window 中显示 echo 输出:

> nul forfiles /P "C:\root" /M "*.txt" /C "cmd /C forfiles /P @path\.. /M @file /C 0x22cmd /C > con echo @relpath0x22"

我这样删除引号:

@ECHO OFF
GOTO START

 usage: 
 script.bat "*.txt" "c:\Documents"
 script.bat "*.txt"
 script.bat
 If no arguments added it will crawl the current directory with wildcard mask (*)
 Avoid root directory (c:\) because too many sub directories for the output console.

 :START
IF "%~2"=="" (SET "_FD=%CD%") ELSE (SET "_FD=%~2")
IF "%~1"=="" (SET "_MA=*") ELSE (SET "_MA=%~1")

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "usebackq delims=" %%A in (
        `forfiles /p %_FD% /s /m %_MA% /C "cmd /c ECHO @relpath"`
    ) DO (
    SET "myfile=%%~A"
    ECHO !myfile:~2!
)
ENDLOCAL   
GOTO :EOF

结果:

thumbnails\A0-1.jpg
thumbnails\new folder\img.jpg