Windowsのコマンドプロンプトを以下のバッチファイルでカスタマイズしようとしました。Windowsのコマンドプロンプトで以下の出力を説明してください。
@echo off
cls
:cmd
set /p "cmd=%cd%>"
%cmd%
goto cmd
私はバッチファイルを開いたときに、それだけでcmd
変数に私のコマンドを受け取り、それを実行し、再び新しいコマンドの入力を要求します。唯一%でcd%
しかし、次のコマンドecho %cd%
出力は、その後、私はdelayedexpansion
を有効にしてecho !cd!
を使用して所望の出力を得ました。
私は
(は私が?を修正しています)ので、遅れ拡大のため、cmd
変数は今echo c:\Users\Sourav\Desktop
を保持している、と思います。しかし、私は、コマンドプロンプト(ない開こうとしたとき、私は混乱しましたバッチファイル)、以下のコマンドを試してみました。
私はc:\Users\Sourav\Desktop
を取得します、と思ったが、私は!cd!
を得ました。これは、echo !cd!
が最初のケースでどのように機能しているかについての私の理解と矛盾します。
2番目のケースで出力が異なるのはなぜですか?
誰もバッチファイルの改善を提案することができますので、最初のケースではecho %cd%
を使用するだけで目的の出力を得ることができますか?
最初の部分は分かりません。あなたが何らかの文字セットのトリッキーをしていない限り、 '%cd%'は常に現在のディレクトリに展開するべきです。 2番目の部分は理にかなっています。 CMDは、評価する変数の入力を1回だけスキャンします。 '%cmd%'とタイプすると、 'echo!cd!'に展開され、それが表示されました。より多くの変数を探すために2回目をスキャンしませんでした。 –
初期の結果は簡単に説明できます。環境変数は一般的には再帰的に展開されません。遅れた展開は別のフェーズなので、そうすることは効果的です。最後の部分では、いくつかの簡単な実験では、遅延拡張はコマンドラインではなく、バッチファイルでのみ機能することが示されています。それほど驚くべきことではない。 Harryが既に指摘したように –
は、 'setlocal enabledelayedexpansion'はバッチファイル内でのみ動作します。デフォルトでは、コマンドラインでの遅延拡張は無効になっていますが、 'cmd/v:on 'を使って新しいインスタンスに対して有効にすることができます – Stephan