2015-09-10 163 views
2

forfiles命令建立几个变量,通过领先的@表示,这回关于当前迭代的项循环体的数据。如何摆脱扩展的`forfiles`变量中的双引号?

相关的所有迭代项目的路径和名称的变量返回封闭在""值。这些都是:@file@fname@ext@path@relpath

所以:你怎么能摆脱封闭双引号的?


例如,下面的代码返回相对路径在给定的根目录到文本文件:

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

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

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

不过,我想文件列表周围无""

我的工作在Windows 7 64位。

回答

3

一种方法是嵌套forfilesfor %I循环并使用%~I膨胀(双万一被批处理文件中所使用的代码的%):

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

文件返回的列表将是(依赖于样品文件从原来的问题):

.\file1.txt 
.\file2.txt 

另一个变型是巢另一个forfiles在初始一个的主体中,因为forfiles去除(非转义)给定的字符串等的命令行内双引号后/C

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在执行内部循环时已扩展,所以引号将被删除,因为它们不会被转义。

所以文件返回列表看起来像(再次从原来的问题采取的示例文件):由forfiles产生

.\file1.txt 

.\file2.txt 

附加线之间断行。您可避免使用重定向(解雇forfiles输出,但在控制台窗口中显示只有echo输出):

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

我删除引号是这样的:

@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