对于windows命令中的循环打印日期两次

时间:2016-06-23 21:01:25

标签: batch-file cmd

我使用windows batch命令将特定时间的cpu负载保存到名为cpu.csv的文件中。我使用以下命令

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

哪种方法可以正常使用,但是可以双重输入日期和时间,如下所示

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

这意味着只有在需要时才打印一次负载百分比,但是日期打印了两次。

2 个答案:

答案 0 :(得分:1)

事实:

  1. for /F loopSKIP包含空行,但在SKIP完成后,FOR /F 忽略(不迭代)空行;
  2. wmic行为:每个输出行以0x0D0D0A<CR><CR><LF>)而非公共0x0D0A<CR><LF>)结尾;即使看似空的尾随行包含<CR>到目前为止它在for /F迭代中不被视为空。
  3. 解决方案#1 :嵌套循环

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

    此处for循环

    • %p检索loadpercentage值;
    • %g删除返回值中的结尾回车

    见Dave Benham的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
    

    说明:第二个标记

    • 在有效行中解析为loadpercentage值(并且尾随<CR>现在属于忽略的第3个令牌);
    • <{1}}行中的
    • 为空,以便<CR>循环跳过它。

    修改:将一个包含完整output redirection的批处理文件添加到for /F文件中。请注意,.csv分隔符更改为csv分号,因为;值包含我当前语言环境中的%time%逗号:

    ,

    输出

    • 输出文件为了确定而被删除;
    • 批处理文件运行三次;
    • 输入文件类型

    ):

    @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
    

答案 1 :(得分:0)

这是完美的批处理文件(如果直接复制并粘贴在cmd中,则无效)

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

如有必要,请使用pause