2017-02-10 46 views
1

我想處理文件名列表,但不知道如何「轉義」命令行以產生一致的輸出,而不管名稱是否包含純文本或特殊字符,如&符號,感嘆號和百分號。如何轉義Windows批處理文件中的保留字符

01 A Test.txt 
02 & Test.txt 
03 ! Test.txt 
04 % Test.txt 

輸出是:如果我在四個樣本文件的名字是我的代碼運行(下)

1 "01 A Test.txt" 
2 "02 & Test.txt" 
"03 COUNT 
4 "04Test.txt" 

與純文本和符號通過正確的文件名(如長因爲它們用引號引起來),但感嘆號和百分號產生完全不同的結果。如何將變量傳遞給子例程,以便所有四種情況得到相同處理(如果可能,將引號從輸出中刪除)?謝謝。

:: CODE 
:: ---- 
@echo off 
setlocal EnableDelayedExpansion 
set /a COUNT=0 
for /f "tokens=*" %%g in ('dir /b *.txt') do (
    set /a COUNT=!COUNT! + 1 
    call :LIST "%%g" !COUNT!    ) 
pause > nul 
exit 

:LIST 
echo %2 %1 
goto :EOF 

回答

2

試試這個:

@echo off 
setlocal EnableDelayedExpansion 
set /a COUNT=0 
for /f "tokens=*" %%g in ('dir /b *.txt') do (
    set /a COUNT=!COUNT! + 1 
    <nul set /p=!count! 
    setlocal disableDelayedExpansion & (
    (echo(%%g) 
) 
    setlocal enableDelayedExpansion 

) 

您可以循環內的開啓/關閉延遲擴展正確呼應特殊字符。 <nul set /p=%%g在最後打印一個沒有新行的字符串 - 正確回顯應該在延遲擴展部分中的計數需要這個字符串。並且在沒有子例程的情況下它會更快地工作。

編輯爲先打印計數。

+1

計數是首先在輸出例子。 – Squashman

+0

@Squashman - 對... – npocmaka

+0

謝謝。這與我一直在嘗試做的事情非常接近。我現在唯一的問題是如何在子程序中做同樣的事情。 –

2

我認爲這也會起作用。

@echo off 

set /a COUNT=0 
for /f "tokens=*" %%g in ('dir /b *.txt') do (
    set /a COUNT+=1 
    set "file=%%g" 
    call :LIST file COUNT 
) 
pause 
exit 

:LIST 
setlocal enabledelayedexpansion 
echo !%2! !%1! 
endlocal 
goto :EOF 

輸出

1 01 A Test.txt 
2 02 & Test.txt 
3 03 ! test.txt 
4 04 % test.txt 
Press any key to continue . . . 
相關問題