2012-12-04 9 views
7

dosバッチファイルの通常のエスケープ文字は、キャレット^です。しかし、%の場合、変数の区切り文字である%は、エスケープは%を倍にします。%%cd%%。ループforの中にparameter extensionsを使用すると物が変化します。 %%~dpnx0の代わりに%~dpnx0を発行すると、ループ外にあるので、D:\Scripts\foo.pyを出力して置換を実行します。FORループでパラメータを使用するときのパーセント(%)をエスケープする方法は?

ここでは、バッチファイルのデモです:

@echo off 
echo This is a pipe: ^| 
echo Use this var for the current directory: %%cd%% 
echo Use this to echo full path of running batch file: %%~dpnx0 

for %%a in (foo.py baz.py) do (
    echo @python %%~dpnxa ^> %%~na.bat 
) 

はこれらは私が得る結果である:

This is a pipe: | 
Use this var for the current directory: %cd% 
Use this to echo full path of running batch file: %~dpnx0 
@python d:\Scripts\foo.py > foo.bat 
@python d:\Scripts\baz.py > baz.bat 

しかし、これは私が欲しいものです:

This is a pipe: | 
Use this var for the current directory: %cd% 
Use this to echo full path of running batch file: %~dpnx0 
@python %~dpnxa > foo.bat 
@python %~dpnxa > baz.bat 

私が倍増試してみました3倍、4倍にすることで、全体的にキャスティングが散りばめられ、すべて成功することはありません。

答えて

7

FOR変数式が展開されないようにすることはできません。変数Xを定義してFORを有効にすると、FOR展開フェーズは常に%Xに展開されます。彼らは内でのみアクセス可能ですけれども(変数FOR

@echo off 
echo This is a pipe: ^| 
echo Use this var for the current directory: %%cd%% 
echo Use this to echo full path of running batch file: %%~dpnx0 

for %%P in (%%) do for %%A in (foo.py baz.py) do (
    echo @python %%P~dpnxA ^> %%~nA.bat 
) 

はグローバルスコープを持っている:

しかし、あなたは変数:) FOR別の背後にあるパーセントを非表示にすることができます

以下は、あなたが探している結果を与えますDO節)。これは潜在的な問題につながる可能性があります。 FORループ内でパーセントリテラルを使用するサブルーチンがある場合は、意図しない結果になる危険性があります。 CALLより前に発行されたFOR文は、CALLされたルーチン内のFOR DO句の結果に影響を与えます。ここで

@echo off 
for %%) in (Yikes!) do call :test 
exit /b 

:test 
echo This works outside loop (confidence = 100%%) 
for %%A in (1) do echo This does not work inside loop (confidence = 100%%) 
for %%P in (%%) do for %%A in (1) do echo This works inside loop (confidence = 100%%P) 
exit /b 

はあなたが、または変数のための別の拡大dbenhamショーのように遅れて拡張またはお電話パーセントを拡張を使用することができ、出力

This works outside loop (confidence = 100%) 
This does not work inside loop (confidence = 100Yikes 
This works inside loop (confidence = 100%) 
+0

whoa、それは奇妙ですが、+1で動作します。ありがとう! (他の解決方法があるかどうかを確認するためにAcceptを遅らせる) –

+2

@mattwilkie - 私は問題がどのように潜在的であるかを示す別の例を追加しました! – dbenham

2

です。

setlocal EnableDelayedExpansion 
set percent=%% 
set "line=%%~dpnxa ^>" 
for %%a in (foo.py baz.py) do (
    echo @python !percent!~dpnxa ^> %%~na.bat 
    call echo @python %%line%% %%~nxa.bat 
) 
関連する問題