プロンプトからこのコマンドを実行しても機能しない理由がわかりません。setlocal はバッチ ファイルからのみ呼び出すことができますか?
setlocal EnableDelayedExpansion & for /l %i in (1,1,3) do (set text=%i & echo Hello !text!)
期待される結果は次のとおりです。
こんにちは1
こんにちは2
こんにちは3
アップデート: 私はWindows8.1を使用しています
答え1
質問が答えです。明らかに、cmd
Windows NT で Microsoft のコマンド インタープリターを使用しています。そのコマンド インタープリターは、setlocal
コマンド スクリプト以外で呼び出されても実際には効果がありません。
他のコマンド インタープリタは、機能、setlocal
コマンド スクリプト外で呼び出せるかどうか、ネストするかどうか、制御しようとしているものを制御するかどうかなどの点で異なります。
オリジナルの はsetlocal
、Microsoft のcmd
OS/2 バージョン 1 では、現在のドライブ、ディレクトリ、環境を保存するだけで、コマンド スクリプト以外では効果がなく、ネストも行われませんでした。ご覧のとおり、過去 25 年間で、このコマンドはさまざまな方向に拡張されてきました。
ここでの違いの理由の 1 つは、JP Software の TCC が複合コマンドで段階的に変数の拡張を実行するため、実行しようとしていることを実行するのに遅延変数拡張トリックが必要ないことです。これは次のようになります。
/l %i in (1,1,3) の場合、(text=%i を設定して Hello %text をエコー) を実行します。… 印刷したいものを印刷します。
参考文献
答え2
答えはかなり単純であることがわかりました。
/l %i in (1,1,3) で (set text=%i を呼び出し、Hello %text をエコー) を実行します。