1行のforループ内でローカル変数を設定しようとしている

1行のforループ内でローカル変数を設定しようとしている

プロンプトからこのコマンドを実行しても機能しない理由がわかりません。setlocal はバッチ ファイルからのみ呼び出すことができますか?

setlocal EnableDelayedExpansion & for /l %i in (1,1,3) do (set text=%i & echo Hello !text!)

期待される結果は次のとおりです。

こんにちは1
こんにちは2
こんにちは3

アップデート: 私はWindows8.1を使用しています

答え1

質問が答えです。明らかに、cmdWindows NT で Microsoft のコマンド インタープリターを使用しています。そのコマンド インタープリターは、setlocalコマンド スクリプト以外で呼び出されても実際には効果がありません。

他のコマンド インタープリタは、機能、setlocalコマンド スクリプト外で呼び出せるかどうか、ネストするかどうか、制御しようとしているものを制御するかどうかなどの点で異なります。

オリジナルの はsetlocal、Microsoft のcmdOS/2 バージョン 1 では、現在のドライブ、ディレクトリ、環境を保存するだけで、コマンド スクリプト以外では効果がなく、ネストも行われませんでした。ご覧のとおり、過去 25 年間で、このコマンドはさまざまな方向に拡張されてきました。

ここでの違いの理由の 1 つは、JP Software の TCC が複合コマンドで段階的に変数の拡張を実行するため、実行しようとしていることを実行するのに遅延変数拡張トリックが必要ないことです。これは次のようになります。

/l %i in (1,1,3) の場合、(text=%i を設定して Hello %text をエコー) を実行します。
… 印刷したいものを印刷します。

参考文献

  • SETLOCALWindows XP コマンドライン リファレンス A ~ Z。 TechNet。マイクロソフト社。
  • SETLOCAL. Take Command / TCC ヘルプ。JP ソフトウェア。
  • ジョナサン・デ・ボイン・ポラード。 SETLOCAL32 ビット コマンド インタープリタのコマンド リファレンス。
  • SETLOCAL. OS/2 Warp コマンド リファレンス。IBM Corporation。
  • J.エメットビーム(1988年)。図解 OS/2. ワードウェア出版. ISBN 9781556220531. p. 40

答え2

答えはかなり単純であることがわかりました。

/l %i in (1,1,3) で (set text=%i を呼び出し、Hello %text をエコー) を実行します。

関連情報