2017-06-30 29 views
1

スクリプトで問題の原因となる文字を削除するためにファイルの名前を変更しようとしています。これはアンパサンドと感嘆符でうまくいきますが、ファイルにパーセント記号がある場合、変数には先頭には表示されません。 forループを介して特殊文字を含むファイルを渡すにはどうすればよいですか?バッチ:変数内の%記号を置き換える方法は?

for %%v in (*) do call :validate "%%v" 
exit /b 

:validate 
set "original=%~nx1" 
set "newtitle=%original:!=%" 
set "newtitle=%newtitle:&=and%" 
setlocal enabledelayedexpansion 
set "newtitle=!newtitle:%%= percent!" 
if not "%newtitle%"=="%original%" ren %1 "%newtitle%" 
+0

あなたはこの構文を見たことがありますか? 'Set" Var = String "' – Compo

+0

はい、なぜですか?それは助けにはならない。 – bricktop

+0

まだありません。 %%を指定すると、結果の変数は空になります。^%は変わりません。 – bricktop

答えて

1

問題は行番号for %%v in (*) do call :validate "%%v", because the call `が2回目にパーサを起動し、すべてのパーセンテージが2回目に評価されます。

変数に値を保存し、これらの変数に関数にアクセスする必要があります。

setlocal DisableDelayedExpansion 
for %%v in (*) do (
    set "filename=%%~v" 
    call :validate 
) 
exit /b 

:validate 
setlocal EnableDelayedExpansion 
set "original=!filename!" 
set "newtitle=%original:!=exclam%" 
set "newtitle=!newtitle:&=and!" 
set "newtitle=!newtitle:%=percent!" 
+0

これは動作します、ありがとう!私はここで良いものを学んでいます。ところで、括弧内の部分を1行にまとめたいのですが、どういう意味ですか?それはただぶち壊されただけですか? – bricktop

+0

@JohnnyRogersあなたは 'set" filename = %%〜v "&call:validate'を意味しますか?それは動作しますが、利点はありません。そしてそれは読むのが難しい – jeb

+0

OK、ローガー。 – bricktop

1

可能な方法はdelayed expansionを使用することです:

set "newfilename=%filename:&=and%" 
setlocal EnableDelayedExpansion 
set "newfilename=!newfilename:%%= percent!" 

endlocal 

% -signは、バッチファイルで、それを2倍にすることにより、エスケープしなければなりません。

この変数は、endlocalコマンド以降では使用できなくなります。

私は引用符付きの構文を使用しました。これは、変数を定義する最も安全な方法です(空白や特殊文字でも)。

関連する問題