2016-06-23 4 views
3

Windowsのバッチコマンドを使用して、特定の時刻にCPU負荷をcpu.csvという名前のファイルに保存しています。私は、次のコマンドを正常に動作しますが、負荷率が印刷されてしまった意味Windowsでループ印刷の日付を2回入力する場合

4,Thu 06/23/201613:59:09.42 
,Thu 06/23/201613:59:09.42 

以下のように日付と時刻の二重のエントリを与える

@for /f "skip=1" %p in ('wmic cpu get loadpercentage') do @echo %DATE%%TIME%,%p>>cpu.csv 

を使用しています一度だけ必要ですが、日付は二回印刷してしまったとして。必要に応じて

+0

おそらくWMICコマンドをプリント出力の3行? – ths

+0

試してみてください: 'skip = 2' :) – Hackerman

+0

@ drishti-ahuja質問に間違ったtahを使用しました。 'dos'の代わりに' cmd'を使います。 – Rishav

答えて

2

ここで完璧なバッチファイルがあります(直接コピーしてCMDに貼り付ける場合は動作しません)

@echo off 
for /f "skip=1" %%p in ('wmic cpu get loadpercentage') do (
    echo %DATE%%TIME%, %%p>>cpu.csv 
    goto :break 
) 
:break 

pauseを使用してください。

+1

loadpercentageが0と9の間の1つの暗号だけであれば完璧ではありません( 'loadpercentage = 2'と言う):[' >> '' redirection](http://ss64.com/nt/syntax -redirection.html)は 'echo Thu 06/23/201613:59:09.42、2 >> cpu.csv'に解決されるので失敗し、コンソールにdatetimeを書き込み、' cpu.csv'にはSTDERR 'が空です。 – JosefZ

+0

@Rishavあなたの解決策は一度だけタイムスタンプを印刷していますが、負荷率の値は正確な値ではなく%pとして印刷されています。 –

+0

@JosefZは絶対に正しいですが、それだけでは完璧ではありません。しかし、恐ろしい日付/時刻出力(質問から派生したもの)の他に、返された行には孤立した復帰文字が含まれているかもしれません(2つのネストされた 'for/F'ループを使用して、 !); 'wmic'クエリが約2秒以上かかるため、日付/時刻の値は実際にはCPU負荷に属しませんが、すぐに拡張されるため、' wmic'クエリが偶数になる前に日付/時刻が取得されます*開始しました... – aschipfl

1

事実:

  1. for /F loopSKIPは空白行を含むが、SKIP後に完了し、FOR /F(反復しない)空の行を無視します。
  2. wmic動作:各出力行は、0x0D0A<CR><LF>)ではなく、0x0D0D0A<CR><CR><LF>)で終了します。 even 一見空です末尾の行にはの反復では空ではないと考えられるので、それまでは<CR>が含まれています。

溶液#1:ネストされたループ

for /f "skip=1" %p in ('wmic cpu get loadpercentage') do @for %g in (%~p) do @echo %DATE%%TIME%,%g 

はここforループがloadpercentage値を取得するために

  • %pです。
  • %gキャリッジリターンの値が返されます。

参照デイブベンハムのWMIC and FOR /F: A fix for the trailing <CR> problem

溶液#2:代わりに、行全体の力空のトークン:

for /f "tokens=2 skip=1" %p in ('wmic cpu get deviceID^, loadpercentage^, Status') do @echo %DATE%%TIME%,%p 

説明:有効で2番目のトークン

  • loadpercentageに解決されますue(そして、末尾の<CR>は無視された第3のトークンに属します)。
  • <CR>ラインは空ですので、for /Fループはそれをスキップします。

編集.csvファイルへoutput redirection完全でバッチファイルを追加しました。 %time%値は私の現在のロケールで,カンマが含まれてcsvセパレータは単に;セミコロンに変更されることに注意してください:

@ECHO OFF 
SETLOCAL enableextensions disabledelayedexpansion 

rem          Solution #1 
for /f "skip=1" %%p in (' 
    wmic cpu get loadpercentage 
         ') do for %%g in (%%~p) do >>f38001801.csv echo %DATE%;%TIME%;%%g 

>NUL 2>&1 timeout /T 2 /NOBREAK 

rem          Solution #2 
for /f "tokens=2 skip=1" %%p in (' 
    wmic cpu get deviceID^, loadpercentage^, Status 
           ') do >>s38001801.csv echo %DATE%;%TIME%;%%p 

が出力確実性のために消去(

  • 出力ファイルを、
  • バッチファイルを3回実行;
  • 出力ファイルを入力

):

==> del *38001801.csv 

==> d:\bat\so\38001801.bat 

==> d:\bat\so\38001801.bat 

==> d:\bat\so\38001801.bat 

==> type *38001801.csv 

f38001801.csv 


24.06.2016;13:41:57,53;1 
24.06.2016;13:42:19,10;11 
24.06.2016;13:42:31,08;4 

s38001801.csv 


24.06.2016;13:42:00,11;1 
24.06.2016;13:42:22,12;2 
24.06.2016;13:42:34,13;1 

==> 
+0

私はあなたの最初の解決策を試しましたが、コマンドラインで作業していましたが、 '' cpu.csv'を追加して出力をファイルに書き込むと動作しません。私は '.bat'ファイルを作るのと同じことを試みましたが、それでも動作しません。 –

+1

**どちらも機能していない**と**はまだ動作しません**フレーズはあなたの問題を考えやすい意味で説明していません。私の編集を参照してください。 – JosefZ

関連する問題