2016-06-22 11 views
1

コマンドを実行して出力をバッチファイルで合計します。ここでは、コードは次のようになります。ループ用Windowsバッチファイルの空白/ヌル値をスキップしてコマンド出力を合計

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET NoOfCores=0 
FOR /F "skip=1 USEBACKQ" %%G IN (`wmic cpu get NumberOfLogicalProcessors`) DO (
    IF NOT "%%G" == "" (
     SET /A NoOfCores = !NoOfCores! + %%G 
    ) 
) 
echo NoOfCores:%NoOfCores% 
ENDLOCAL 

私はERRORと一緒に正しい出力を取得しています。このバッチファイルを実行すると:私は手動でコマンドwmic cpu get NumberOfLogicalProcessorsを実行すると

Missing operand. 
NoOfCores:8 

、私はこのような出力を得ています:

NumberOfLogicalProcessors 
4 
4 

出力で最後の空白行をスキップする方法を教えてもらえますか?

IF条件でブランク/ヌル値のチェックについていくつかの記事を紹介しましたが、動作していないようです。

答えて

2

出力wmicは、コマンドで解析する際に問題を引き起こすUTF-16リトルエンディアンでエンコードされます。

コマンド FOR はキャリッジリターン復帰改行として単一バイト符号化されたテキストに変換Unicodeからのファイルの終わりを解釈します。 キャリッジリターンは、最後の行を空にしません。提供されたバッチコードでは、ループ変数に改行が含まれているため、IF NOT "%%G" == ""がtrueになります。しかし、のSETは、算術式の評価でキャリッジリターンを空白文字として解釈するため、追加時に2番目のオペランドが実際にはありません。

しかし、コマンドプロンプトウィンドウでバッチファイルを実行すると、最初の行には@echo onが表示され、コンソールウィンドウへの書き込みはストリームライターによってすべてのキャリッジリターンが削除されます。

詳細については、How to correct variable overwriting misbehavior when parsing outputの回答を参照してください。

回避策の一つは、最初の一時ファイルにWMICの出力をリダイレクトして、コマンドTYPEコマンドよりもUnicodeからOEMへの変換でより良い仕事をするようラインを処理するために FOR 内のコマンドTYPEを使用することですの場合はです。一時ファイルは、行の処理後に削除されます。使用するコマンドを理解し、どのように彼らは、コマンドプロンプトウィンドウを開き、そこに次のコマンドを実行し、完全にページが非常に慎重に、各コマンドのために表示されているすべてのヘルプを読んで、仕事のため

@echo off 
setlocal EnableDelayedExpansion 
%SystemRoot%\System32\wbem\wmic.exe cpu get NumberOfLogicalProcessors >"%TEMP%\NumberOfLogicalProcessors.tmp" 
set "NoOfCores=0" 
for /F "skip=1" %%G in ('type "%TEMP%\NumberOfLogicalProcessors.tmp"') do set /A NoOfCores+=%%G 
del "%TEMP%\NumberOfLogicalProcessors.tmp" 
echo NoOfCores: %NoOfCores% 
endlocal 

  • del /?
  • echo /?
  • endlocal /?
  • for /?
  • set /?
  • setlocal /?
  • type /?
  • wmic cpu get /?
+0

ニース!!それは完璧に働いた。 – keenUser

1

Mofi's answerここでは何が起こっているのかを説明し、その解決策を示します。

もう1つのループを配置してもう1つのループの出力を解析して、孤立した復帰文字を取り除く方法は、さらに簡単です。これは、Unicodeテキストの正しい構文解析のための最も簡単で多目的なソリューションです。だからここ

は、私が使用するコードです:

@echo off 
set /A NoOfCores=0 
for /F "skip=1" %%G in ('wmic cpu get NumberOfLogicalProcessors') do (
    for /F %%H in ("%%G") do (
     set /A NoOfCores+=%%G 
    ) 
) 
echo NoOfCores: %NoOfCores% 

この方法は、dbenhamに入金される - Why is the FOR /f loop in this batch script evaluating a blank line?に彼の答えとも彼の社外品WMIC and FOR /F : A fix for the trailing <CR> problemを参照してください。

関連する問題