51

拡張の遅延がある場合とない場合で、バッチ スクリプトの動作が異なる例を誰か教えてもらえますか? 遅延展開を使用したくない状況はありますか? ありがとう。

4

4 に答える 4

68

次の例を見てください...

例 1:次のコードは遅延展開を使用しないため、for ループ内の変数は 1 回だけ展開されます。これは、set コマンドで何を行っても、ループの各反復で%Count%が常に に展開されることを意味します。0

@echo off
set COUNT=0

for %%v in (1 2 3 4) do (
  set /A COUNT=%COUNT% + 1
  echo Count = %COUNT%
)
pause

したがって、このスクリプトは次のように出力します。

Count = 0
Count = 0
Count = 0
Count = 0

これは、このループが機能するはずの方法ではありません。

例 2:一方、遅延展開を使用すると、次のスクリプトが期待どおりに実行されます。

setlocal ENABLEDELAYEDEXPANSION
set COUNT=0

for %%v in (1 2 3 4) do (
  set /A COUNT=!COUNT! + 1
  echo Count = !COUNT!
)

pause

そして、予想どおり、次のように出力されます。

Count = 1
Count = 2
Count = 3
Count = 4

を使用し、代わりに をENABLEDELAYEDEXPANSION使用して変数を展開すると、変数は毎回再展開され、すべてが想定どおりに機能します。!%

于 2012-05-11T21:30:31.510 に答える
8

Max's answer、遅延展開の有無にかかわらず、バッチ スクリプトの動作が異なる例を示しています。

完全を期すために、質問の別の部分に答えて、データに感嘆符が含まれている場合に遅延展開を使用したくない状況を示しましょう!(そして、そのようなデータを処理する 2 つの方法を示します)。

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion

  set "_auxFile=%temp%\%~n0.txt"
  rem create multiline sample file
  >"%_auxFile%" ( for /L %%G in (1,1,3) do echo line %%G is 100%% valid! Sure! Hurrah!)
  rem create one-line sample file
  >"%_auxFile%" echo this line is 100%% valid! Sure! Hurrah!

  echo(
  echo --- file content 
  type "%_auxFile%"

  echo(
  SETLOCAL EnableDelayedExpansion
    echo --- enabled delayed expansion chokes down unescaped exclamation marks^^^! "^!"
    for /F "usebackq delims=" %%G in ("%_auxFile%") do (
      set "_auxLine=%%~G"
      echo loop var=%%~G
      echo _auxLine=!_auxLine!
    )
  ENDLOCAL
  echo(
  SETLOCAL DisableDelayedExpansion
    echo --- toggled delayed expansion works although might be laborious!
    for /F "usebackq delims=" %%G in ("%_auxFile%") do (
      set "_auxLine=%%G"
      echo loop var=%%G
      SETLOCAL EnableDelayedExpansion
        echo _auxLine=!_auxLine!
      ENDLOCAL
    )
  ENDLOCAL
  echo(
  SETLOCAL DisableDelayedExpansion
    echo --- keep delayed expansion DISABLED: use CALL command!
    for /F "usebackq delims=" %%G in ("%_auxFile%") do (
      set "_auxLine=%%G"
      echo loop var=%%G
      call :ProcessVar
    )
  ENDLOCAL

  rem delete the sample file
  del "%_auxFile%"
ENDLOCAL
goto :eof

:ProcessVar
  echo _auxLine=%_auxLine%
  echo WARNING: neither !_auxLine! nor %%G loop variable is available here!  
goto :eof

上記のスクリプトは適切なエスケープ方法を示していることに注意してください

  • %パーセント記号を%%2 倍にする (遅延展開は問題にならない)、および
  • !遅延展開が有効な場合は感嘆符:
    • "^!"二重引用符のペアで囲まれている場合は、cmdand バッチ スクリプトの一般的なエスケープ文字^キャレットを使用します。
    • ^^^!それ以外の場合は、3 つの^キャレットを使用します。

出力:

==> D:\bat\SO\10558316.bat

--- file content
this line is 100% valid! Sure! Hurrah!

--- enabled delayed expansion chokes down unescaped exclamation marks! "!"
loop var=this line is 100% valid Hurrah
_auxLine=this line is 100% valid Hurrah

--- toggled delayed expansion works although might be laborious!
loop var=this line is 100% valid! Sure! Hurrah!
_auxLine=this line is 100% valid! Sure! Hurrah!

--- keep delayed expansion DISABLED: use CALL command!
loop var=this line is 100% valid! Sure! Hurrah!
_auxLine=this line is 100% valid! Sure! Hurrah!
WARNING: !_auxLine! as well as %G loop variables are not available here!

==>
于 2016-06-25T10:26:43.880 に答える