2016-10-07 5 views
0

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

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は、新しいコマンドを開始した後は無効である、ここには空白はありません。

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

更新: "別のプロセスを作成する"という行が間違っているため削除されました。

答えて

2

$T^&の違いは、異なるコマンドの実行を処理するwhoです。 $Tが使用される場合

doskeyが一つのコマンド以上であり、それは直列副作用として空白行とプロンプトラインと、現在cmdインスタンスにコマンドを実行する人自身であることを知っています。

^&が使用されている場合、doskey(誰が$接頭辞付き文字をチェックしているか)は、特別な意味を持たない文字のみを表示します。マクロが呼び出されると、doskeyは1つのコマンド(フルライン)のみを実行し、今度は連結されたコマンドを見て、今回は追加の行なしでシリアル実行を処理するパーサーであるcmdです。

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

ここで、1つではなく、解決する2つの問題があります。 ^&ケースの可変展開と$Tケースの追加ライン。

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

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

callコマンドを使用することができますしかし、他の問題を解決する方が簡単です。空とプロンプト行は単にecho問題

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

ちょうど終わりに開始時echo offonを回しています。

+0

ご意見をお聞かせください。 – antonio

+0

@antonio、ちょうど正確に言うと、 '環境変数を継承しない 'も正しくありません。 1)新しいプロセスが存在しません。継承するものは何もありません。2)変数はエコーされませんが、正しく初期化されていれば、 'echo ^%^%^%b %%'を' set'コマンドで置き換え、それらの値を直接取得することはできません。 –

関連する問題