2016-09-01 91 views
1

私はstackoverflowを含め、そのように動作するバッチスクリプトをいくつか見てきました。WMICコマンドの結果を取得し、それを変数に格納します

私の質問は簡単です:なぜMEMの部分がうまくいかないのですか?

@echo OFF 

SET CPU="$CPU" 

echo CPU: %NUMBER_OF_PROCESSORS% 

FOR /F "delims=" %%i IN ('wmic computersystem get TotalPhysicalMemory') DO set MEM=%%i 

echo MEM: %MEM% 
+0

!私は、適切なテキスト解析を妨げる孤立したキャリッジリターン文字を残す 'for/F'によって' wmic'出力のUnicode-ANSI変換から派生した問題に遭遇したと思います。解決策のためにこの記事を見てください:[wmicの出力をシェルスクリプトで解析する](http://stackoverflow.com/a/19351263)。 – aschipfl

答えて

1

これは簡単です。 wmic computersystem get TotalPhysicalMemoryは、3行のテキストを出力します。

TotalPhysicalMemory 
12867309568 
<blank line> 

forループは3回繰り返します。最初の1つでMEMTotalPhysicalMemoryに設定され、2番目の設定では12867309568に設定され、最後になります。あなたの出力は空です。

これは非常に醜いですが、あなたの問題を解決します:

@echo OFF 
setlocal enabledelayedexpansion 
SET CPU="$CPU" 
echo CPU: %NUMBER_OF_PROCESSORS% 
FOR /F "delims= skip=1" %%i IN ('wmic computersystem get TotalPhysicalMemory') DO (
    set MEM=%%i 
    goto STOP 

) 
:STOP 
echo MEM: !MEM! 

skip=1TotalPhysicalMemoryを無視し、goto STOPは、最初の反復の後にループを中断します。

+0

実際には、質問を簡略化するためにコマンドが編集されました。意図は: 'wmic computersystem get TotalPhysicalMemory | FINDSTR -v "合計"」 とのスクリプトの結果、私の(4台のサーバでテスト): G:\> CPU get_numphycpu.bat:6 MEM:ところで –

+0

、答えてくれてありがとう。それはうまくいきました: –

+0

@DavidLago WMICの出力を 'For/Do'ループで書式化して私の答えをチェックすることもできます – Hackoo

5

あなたはそのようなFor/DoループでWMICの出力をフォーマットすると、そのような何かを行うことができます:「動作しない」に詳しく説明してください

@echo off 
Call :GetTotalPhysicalMemory 
echo TotalPhysicalMemory = %MEM% & pause 
exit 
::*********************************************** 
:GetTotalPhysicalMemory 
for /f "tokens=2 delims==" %%a in (' 
    wmic computersystem get TotalPhysicalMemory /value 
') do for /f "delims=" %%b in ("%%a") do (
    Set "MEM=%%b" 
) 
exit /b 
::*********************************************** 
関連する問題