このコードを作りました
dir /B /S %RepToRead% > %FileName%
for /F "tokens=*" %%a in ('type %FileName%') do (
set z=%%a
echo %z%
echo %%a
)
echo %%a
正常に動作していますが、 echo %z%
「エコー無効」が返されます。
のように変数を分割したいので、 %z% を設定する必要があります%z:~7%
何か案は?
このコードを作りました
dir /B /S %RepToRead% > %FileName%
for /F "tokens=*" %%a in ('type %FileName%') do (
set z=%%a
echo %z%
echo %%a
)
echo %%a
正常に動作していますが、 echo %z%
「エコー無効」が返されます。
のように変数を分割したいので、 %z% を設定する必要があります%z:~7%
何か案は?
for ループと括弧のスコープ内で変数を設定および使用するには、2 つの方法があります。
setlocal enabledelayedexpansion
を参照setlocal /?
してください。これは、XP/2000 以降のバージョンの Windows でのみ機能します。次に、ループ内の!variable!
代わりに使用します...%variable%
バッチ goto ラベルを使用してバッチ関数を作成します:Label
。
例:
for /F "tokens=*" %%a in ('type %FileName%') do call :Foo %%a
goto End
:Foo
set z=%1
echo %z%
echo %1
goto :eof
:End
バッチ関数は非常に便利なメカニズムです。
あなたはおそらくしたいですSETLOCAL ENABLEDELAYEDEXPANSION
。詳細については、 https://devblogs.microsoft.com/oldnewthing/20060823-00/?p=29993を参照してください。
基本的には、ノーマルはコマンドを読み込んだ%variables%
直後に展開されます。cmd.exe
あなたの場合、「コマンド」は全体です
for /F "tokens=*" %%a in ('type %FileName%') do (
set z=%%a
echo %z%
echo %%a
)
ループ。その時点でz
は にはまだ値がないため、 にecho %z%
変わりますecho
。次に、ループが実行されてz
設定されますが、その値は使用されなくなります。
SETLOCAL ENABLEDELAYEDEXPANSION
追加の構文を有効にします!variable!
。これも変数を展開しますが、各 (サブ) コマンドが実行される直前にのみ展開します。
SETLOCAL ENABLEDELAYEDEXPANSION
for /F "tokens=*" %%a in ('type %FileName%') do (
set z=%%a
echo !z!
echo %%a
)
これによりz
、実行するたびに現在の値が得られますecho
。
私はこれに何時間も苦労しました。これは、コマンドライン変数を登録するための私のループです。例 : Register.bat /param1:value1 /param2:value2
すべてのコマンドラインパラメーターをループし、適切な名前の変数を値に設定します。
その後、 set value=!param1! を使用できます。set value2=!param2!
パラメータが与えられた順序に関係なく。(いわゆる名前付きパラメーター)。%<>% の代わりに !<>! に注意してください。
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%P IN (%*) DO (
call :processParam %%P
)
goto:End
:processParam [%1 - param]
@echo "processparam : %1"
FOR /F "tokens=1,2 delims=:" %%G IN ("%1") DO (
@echo a,b %%G %%H
set nameWithSlash=%%G
set name=!nameWithSlash:~1!
@echo n=!name!
set value=%%H
set !name!=!value!
)
goto :eof
:End
%var%、!var!、および %% を使用したバッチ コードの簡単な例。
このコード例では、組み込み変数 TIME を使用して開始時間を取得することに重点を置いています (時間は常に自動的に変更されるため、時間を使用しています)。
コード:
@echo off
setlocal enabledelayedexpansion
SET "SERVICES_LIST=MMS ARSM MMS2"
SET START=%TIME%
SET "LAST_SERVICE="
for %%A in (%SERVICES_LIST%) do (
SET START=!TIME!
CALL :SOME_FUNCTION %%A
SET "LAST_SERVICE=%%A"
ping -n 5 127.0.0.1 > NUL
SET OTHER=!START!
if !OTHER! EQU !START! (
echo !OTHER! is equal to !START! as expected
) ELSE (
echo NOTHING
)
)
ECHO Last service run was %LAST_SERVICE%
:: Function declared like this
:SOME_FUNCTION
echo Running: %1
EXIT /B 0
コードに関するコメント:
参考文献
次のリンクを使用して、詳細な理由を確認してください。