12

dos バッチ ファイルの通常のエスケープ文字は、キャレット、^. ただし、%変数の区切り文字であるパー​​セントの場合、エスケープはパーセントを 2 倍にすることです%%cd%%。ループ内でパラメーター拡張を使用すると状況が変わります。を放出するfor代わりに、ループの外側で、置換を実行し、 を放出します。%%~dpnx0%~dpnx0D:\Scripts\foo.py

バッチ ファイルのデモを次に示します。

@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

パーセントを2倍、3倍、4倍にしてみましたが、全体にキャレットが散在していますが、すべて成功しませんでした。

4

2 に答える 2

9

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

ここに出力があります

This works outside loop (confidence = 100%)
This does not work inside loop (confidence = 100Yikes
This works inside loop (confidence = 100%)
于 2012-12-04T19:46:17.427 に答える
5

遅延展開または呼び出しパーセント展開を使用するか、dbenham が別の FOR 変数を展開するように示します。

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
)
于 2012-12-04T21:54:58.863 に答える