2017-02-10 14 views
1

ファイル名のリストを処理しようとしていますが、名前にプレーンテキストと特殊文字が含まれているかどうかに関係なく、コマンドラインを "エスケープ"アンパサンド、感嘆符、パーセント記号などの文字。私は名前がある4つのサンプルファイルに(下)私のコードを実行した場合: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" 

プレーンテキストやアンパサンドを含むファイル名が正しく(限り通過しますそれは引用符で囲まれているためです)、感嘆符とパーセント記号は全く異なる結果をもたらします。変数をサブルーチンに渡すと、4つのケースすべてが同じように処理されます(可能であれば、出力から引用符が削除されます)。ありがとうございました。

:: 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

はこれを試してください:あなたは正しいが、特殊文字をエコーするためにforループ内遅れる拡大をオン/オフにすることができ

@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

@スカッシュマン - 右... – 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 . . .