2015-09-10 162 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