1

doskeyコマンド区切り文字 ( )は$T、コマンドが出力を生成しない場合に空白行を生成します。

C:\> set "a="                                                    

C:\> set "b="                                                    

C:\> doskey test=set "a=foo" $T set "b=bar" $T echo ^%a^% ^%b^%

C:\> test                                                      

C:\>                                                           
C:\> foo bar                                                   

を発行した後の空白行に注意してくださいtest。これは読みやすさに影響します。

には、空白を追加しないよく知られた^?代替手段がありますが、新しいコマンドは環境変数を継承しません。$T

C:\> set "a="                                                    

C:\> set "b="                                                    

C:\> doskey test=set "a=foo" ^& set "b=bar" ^& echo ^%a^% ^%b^%

C:\> test                                                      
%a% %b%     

ここに空白はありません。とにかくset、新しいコマンドを開始した後は無効です。

空白行を削除するにはどうすればよいですか?

更新: 間違っていたため、「別のプロセスを作成する」行を削除しました。

4

1 に答える 1

5

$Tとの違い^&は、さまざまなコマンドの実行を誰が処理するかです。

$T使用されると、doskey複数のコマンドがあることを認識し、現在のcmdインスタンスでコマンドをシリアルに実行するのは自分自身であり、空白行とプロンプト行が副作用として表示されます。

^&を使用すると、(接頭辞の文字doskeyをチェックして$いる) には、特別な意味を持たない文字しか表示されません。マクロが呼び出されると、doskey1 つのコマンド (行全体) のみが実行され、cmd連結されたコマンドを認識してシリアル実行を処理するパーサーが、今回は行を追加せずに実行します。

示された「...環境変数を継承しない別のプロセスを作成します。」は正しくありません。追加のプロセスはありません。表示されるのは、通常の変数展開の「問題」です。実行する最終的なコマンドを生成するために、変数の読み取り操作は解析時に行から削除されます。変数を変更する実行を開始する前に、解析中に読み取り操作が置き換えられたため、行内の変数を変更して、後のコマンドで同じ行から変更された値を取得することはできません。(ここを読む)

さて、解決すべき問題は 1 つではなく 2 つです。ケース内の変数展開と^&ケース内の追加行$T

遅延拡張が有効になっていない場合、コマンド ライン コンテキスト (バッチ ファイル内のみ) で現在のインスタンスから有効にすることはできませんcmd。そのため、問題を解決するには、行の追加の解析を強制して、変更されたファイルを強制的に取得する必要があります。価値。callコマンドの前にコマンドを使用できますecho

doskey test=set "a=foo" ^& set "b=bar" ^& call echo ^%a^% ^%b^%

しかし、他の問題を解決する方が簡単です。空行とプロンプト行は単純なecho問題です

doskey test=echo off $t set "a=foo" $t set "b=bar" $t echo ^%a^% ^%b^% $t echo on

echo off最初と最後に回すだけon

于 2016-10-08T09:17:42.443 に答える