2016-06-25 5 views
3

Windowsのコマンドプロンプトを以下のバッチファイルでカスタマイズしようとしました。Windowsのコマンドプロンプトで以下の出力を説明してください。

@echo off 
cls 
:cmd 
set /p "cmd=%cd%>" 
%cmd% 
goto cmd 

私はバッチファイルを開いたときに、それだけでcmd変数に私のコマンドを受け取り、それを実行し、再び新しいコマンドの入力を要求します。唯一%でcd%

しかし、次のコマンドecho %cd%出力は、その後、私はdelayedexpansionを有効にしてecho !cd!を使用して所望の出力を得ました。

enter image description here

私は

は私が?を修正しています)ので、遅れ拡大のため、cmd変数は今echo c:\Users\Sourav\Desktopを保持している、と思います。しかし、私は、コマンドプロンプト(ない開こうとしたとき、私は混乱しましたバッチファイル)、以下のコマンドを試してみました。

enter image description here

私はc:\Users\Sourav\Desktopを取得します、と思ったが、私は!cd!を得ました。これは、echo !cd!が最初のケースでどのように機能しているかについての私の理解と矛盾します。

2番目のケースで出力が異なるのはなぜですか?

誰もバッチファイルの改善を提案することができますので、最初のケースではecho %cd%を使用するだけで目的の出力を得ることができますか?

+1

最初の部分は分かりません。あなたが何らかの文字セットのトリッキーをしていない限り、 '%cd%'は常に現在のディレクトリに展開するべきです。 2番目の部分は理にかなっています。 CMDは、評価する変数の入力を1回だけスキャンします。 '%cmd%'とタイプすると、 'echo!cd!'に展開され、それが表示されました。より多くの変数を探すために2回目をスキャンしませんでした。 –

+1

初期の結果は簡単に説明できます。環境変数は一般的には再帰的に展開されません。遅れた展開は別のフェーズなので、そうすることは効果的です。最後の部分では、いくつかの簡単な実験では、遅延拡張はコマンドラインではなく、バッチファイルでのみ機能することが示されています。それほど驚くべきことではない。 Harryが既に指摘したように –

+2

は、 'setlocal enabledelayedexpansion'はバッチファイル内でのみ動作します。デフォルトでは、コマンドラインでの遅延拡張は無効になっていますが、 'cmd/v:on 'を使って新しいインスタンスに対して有効にすることができます – Stephan

答えて

3

別のレベルの解析が必要です。 callを使用すると、そうすることができます。

@echo off 
cls 
:cmd 
set /p "cmd=%cd%>>" 
call %cmd% 
goto cmd 
+0

「!cd!」はいつ展開されるのですか?別の混乱がありますか? 'cmd'変数を設定するとどうなりますか?そのため、 'cmd = echo c:\ Users \ Sourav \ Desktop'? 'cmd = echo!cd!'を保存し、 '%cmd%'を実行すると 'c:\ Users \ Sourav \ Desktop'に展開されます。 set/pは読み込み時に実際に変数を展開しますか? –

+3

これは変数を展開する 'set'ではなく、パーサです。それはかなり複雑ですが、あなたはいくつかの良い説明を見つけることができます[ここ](http://stackoverflow.com/q/4094699/2152082)。 – Stephan

関連する問題