OPを理解しているので、Aaciniとstackoverflowの答えは間違っています。
num
(Aacini の) 遅延拡張ソリューションは、バッチを開始する前に が定義されている場合にのみ機能し、それ以外の%mnm%
場合は拡張しません。
C:\>set "num="
C:\>myBatch.bat user%num%
の出力への結果
user%num%
(stackoverflow の) 他の解決策は少しうまく機能しますが、が定義されていると失敗しますnum
set num=2
私はそれを示すために秒を追加しました
@ECHO off
SET param=%1
SET num=1
CALL SET x=%param%
ECHO %x%
set num=2
CALL SET x=%param%
ECHO %x%
2回呼び出すと問題が表示されます
C:\>myBatch user%num%
user1
user2
C:\>myBatch user%num%
user2
user2
2 回目の実行2
では、バッチの開始時に結果が修正されるため、2 回取得しました。
format-stringが実際に存在するかどうか、またはが既に展開され ているかどうか%1
を確認するために、 の内容をエコーすることをお勧めします。%num%
OPを理解しているので(理解していない可能性があります!)、質問はプレースホルダーの使用に関するものです
が、これはコマンドラインでのみ機能し(別のバッチからではなく)、パーセントでのみ機能するため、注意が必要ですその時点で変数が定義されていない場合に機能します。
変数が定義されている場合、 は%num%
すぐに展開され、その内容は%1
isuser2
と not user%num%
(num=2 と仮定) になるためです。
ときどき機能するのは、cmd-line パーサーの副作用にすぎません。未定義の変数 (バッチ ファイル内のように) を削除しないためです。代わりに、未定義の変数の展開はまったく変更されません。
echo "%thisIsUndefined%" - from cmd-line this outputs `"%thisIsUndefined%"`
echo "%thisIsUndefined%" - from a batch file this outputs `""`
ただし、副作用として、コマンド ライン コンテキストでパーセント記号をエスケープする方法はありません。疑似エスケープ
の回避策しかありません。
パーセントを実際にエスケープするわけではありませんが、ほとんどの場合、という名前の変数は存在しません。
mybatch user%num^%
num^
次に、stackoverlow のソリューションは次のように機能します。
myBatch user%num^%
しかし、私はAaciniが言及した遅延拡張を好みます.
次に、パーセントの代わりに感嘆符を使用してバッチを呼び出します。通常、遅延拡張はデフォルトで無効になっているため、これはうまく機能します。
myBatch user!num!
バッチ自体は次のようになります
@echo off
set "param=%1"
Setlocal EnableDelayedExpansion
set num=1
echo %param%
set num=2
echo %param%