2017-02-02 11 views
0

CMDコマンドライン: 1つのCMDコマンド、1つのコマンド行、BATファイルなし。CMDコマンドライン:1つのコマンドと、ERRORLEVELをTXTに直接出力しますか?

ERRORLEVELをTXTファイルに直接書き込む機会はありますか?

私は試みましたが、失敗しました。

毎回BATファイルを作成して保存したくありません。

CMDの単一コマンドとTXTファイルのERRORLEVELを1つのコマンドラインでエクスポートする方が簡単です。トミー

+2

質問を分かりやすい状態に書き換えてください。 'errorlevel'をファイルに書くことと、バッチファイルで失敗することを除いて、あなたが望むものはほとんど得られません。その場合、私はバッチファイルを表示することを提案しますか、またはあなたが何か問題を抱えていて、少し修正することをお勧めします:) – geisterfurz007

+0

"私はBATファイルを作成して保存したくありません。 これは理解しにくいですか? :-) 「オンザフライ」で多くのCMDコマンドを実行したい。 多くのBATファイルを作成するのは最良の方法ではありません。 いずれの場合も、コマンドは1つだけです。そして、エラーレベルが必要です(結果として得られる5または6の整数値があります)。 – Donny73Ger

+0

** **バッチファイルを作成せず**保存しない**!簡単なブーム!しかし、あなたの質問ではないと思います...ここに行くにはいくつかの方法があります:コマンドプロンプトに必要なときはいつでも入力し、ダブルクリックの使用のためのバッチファイルを作成したり、より迅速な使用のための環境変数。 – geisterfurz007

答えて

4

この

、通常の最初のアイデア、問題は完全なコマンドラインが解析され、その後、実行されることである

(commandToExecute) & >"file.txt" echo %errorlevel% 

失敗します。解析フェーズでは、コマンドの実行を開始する前に、すべての可変読取り操作が、変数内に格納されている値で置き換えられるコマンドから削除されます。

これは、実行されたコマンドに読み取り操作がないため、変数を変更して変更された値を取得できないことを意味します。

ノート:ありません。この場合、読み取りながら、しかし、ブロック内のすべての行に、この置き換え/パース行動がフルラインに影響を与え、それは、括弧で囲まれたすべての行です。実行がコードブロックに達すると、ブロック内のすべての行が読み込まれ、ブロック内のすべての変数読み込み操作が置き換えられ、結果のコマンドの実行が開始されます。

本当のコマンドを実行し、それに対処するための

(commandToExecute) & >"file.txt" echo 0 

通常の方法は、遅延拡張を可能にするためである(supossing ERRORLEVELを実行する前に0である)です。これにより、変数へのアクセスに使用する構文が必要な場所を%var%から!var!に変更できます。これはパーサーに対して、変数/値の置換は、行が解析されるときではなく、コマンドが実行されるまで遅延されなければならないことを示します。これはsetlocal enabledelayedexpansionコマンドで行われます。

しかし、このコマンドはコマンドラインでは効果がありません。バッチファイルでのみ有効です。コマンドラインでは、スイッチでcmdインスタンスを起動して、遅延拡張を有効にする必要があります。あなたが遅延拡張を使用してcmdインスタンスを起動する場合は、

(commandToExecute) & >"file.txt" echo !errorlevel! 

を使用することができます。しかし遅延拡張を有効にしてパーサが可変の読み取り要求の一部としてそれを見るように、コマンドで!は、問題をbecames。

あなたには別の方法があります。あなたは変数が認識され、コマンドがあるされていない^で変数が解析時に置き換えられないますような方法でコマンドを記述し、その後、実行時に

(commandToExecute) & >"file.txt" call echo %^errorlevel% 

コマンドの新しい解析を強制することができます解析されcallコマンドが新たな解析フェーズが呼び出され実行され、最初のコマンドが実行されたとerrorlevelが変更された後、次に、変数が一列に置換されるとき、そして

(commandToExecute) & >"file.txt" call echo %errorlevel% 

として実行正しい値がファイルに送信されます。コメントに適応するためにを編集し

- ただ、テストセッション(申し訳ありませんが、スペイン語のロケールを)

W:\41996740>dir /b 

W:\41996740>(commandToExecute) & >"file.txt" call echo %^errorlevel% 
"commandToExecute" no se reconoce como un comando interno o externo, 
programa o archivo por lotes ejecutable. 

W:\41996740>dir /b 
file.txt 

W:\41996740>type file.txt 
9009 

W:\41996740>(dir /b file.txt) & >"file.txt" call echo %^errorlevel% 
file.txt 

W:\41996740>type file.txt 
0 

W:\41996740>(dir /b file.exe) & >"file.txt" call echo %^errorlevel% 
No se encuentra el archivo 

W:\41996740>type file.txt 
1 

W:\41996740> 
+0

印象的です。私はOPが望んでいたものを得なかった...良い説明! – geisterfurz007

+0

こんにちは、これは正確に必要です:(commandToExecute)&echo%errorlevel%> "file.txt" しかし、動作しません。 – Donny73Ger

+0

@ Donny73Ger、いいえ、あなたはそれが動作しないと指摘するので、あなたはそれを必要としません。あなたは '(commandToExecute)&>" file.txt "を呼び出すecho%^ errorlevel%' –

0

enabled Delayed Expansionを使用して別のアプローチ(/V:ONスイッチを参照)、単に完全性のために:

cmd /D /V:ON /C "command to execute&>>currError.txt echo !errorlevel!" 

currError.txtへの出力は、に加えて日付と時刻のスタンプを含むように拡張されています):

==> type currError.txt 
The system cannot find the file specified. 

==> cmd /D /V:ON /C "echox "x"&>>currError.txt echo %date% %time% errorlevel !errorlevel!" 
'echox' is not recognized as an internal or external command, operable program or batch file. 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 

==> cmd /D /V:ON /C "echo "x"&>>currError.txt echo %date% %time% errorlevel !errorlevel!" 
"x" 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 
02.02.2017 9:12:43,32 errorlevel 0 

==> rem output fails if "command to execute" is syntactically wrong 

==> cmd /D /V:ON /C "if "x"&>currError.txt echo %date% %time% errorlevel !errorlevel!" 
& was unexpected at this time. 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 
02.02.2017 9:12:43,32 errorlevel 0 

==> rem "call" approach for the sake of completeness: 

==> echox "x"&>>currError.txt call echo %date% %time% errorlevel %errorlevel^% 
'echox' is not recognized as an internal or external command, operable program or batch file. 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 
02.02.2017 9:12:43,32 errorlevel 0 
02.02.2017 14:42:28,06 errorlevel 9009 

==> rem fails as well if "command to execute" is syntactically wrong 

==> if "x"&>>currError.txt call echo %date% %time% errorlevel %errorlevel^% 
& was unexpected at this time. 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 
02.02.2017 9:12:43,32 errorlevel 0 
02.02.2017 14:42:28,06 errorlevel 9009 

==> 
+0

これは動作します: cmd/von/c "call(commandToExecute)&>" file.txt "echo!errorlevel! – Donny73Ger

0

まず、パーセント記号で "P" の変数を定義します。

set "p=%" 

次に、この行を使用します。

のWindows 8.1

でテスト
(commandToExecute) & >"file.txt" call echo %p%errorlevel%p% 

関連する問題