【问题标题】:How can I insert a command result in the same "echo" line?如何在同一“回显”行中插入命令结果?
【发布时间】:2015-05-06 08:21:00
【问题描述】:

我想用这些信息创建一个日志文件: echo %time%;%date%;%computername%;"findstr /I "%%a" %MYFILES%\Dir_ALL.txt" >> %computername%_File.csv

我怎样才能写出不会写“findstr /I ...”但是这个命令的输出的东西?

我希望将所有内容都放在输出文件的同一行中。

谢谢

【问题讨论】:

    标签: batch-file batch-processing


    【解决方案1】:

    set /p写一个不换行的行,然后是第二行:

    <nul set /p .=%time%;%date%;%computername%;>>%computername%_File.csv
    findstr /I "%%a" %MYFILES%\Dir_ALL.txt>>%computername%_File.csv
    

    注意:由于%%a 我猜,您在forstatement 中使用此代码片段。我建议使用!time! 而不是%time% 来获取实际时间(当然使用延迟扩展)

    【讨论】:

    • 谢谢,我会试试的。你能告诉我为什么我需要使用“!”如果我在“FOR”语句中,而不是“%”? (对不起我的菜鸟问题)。
    • 没问题。整个forstatement 被一次解析,所以%time% 不会改变(可能是一个问题,如果你循环一段时间)!time! 每次都会被评估,它发生了)。请参阅 herehere 进行演示。
    【解决方案2】:

    您必须使用命令结果设置一个变量。 Windows Batch help in setting a variable from command output 对此进行了回答,使用了一个虚拟 for 循环,其循环变量是从文件的内容中设置的。

    应该是这样的:

    findstr /I "%%a" %MYFILES%\Dir_ALL.txt >%temp%\temp.txt
    for /f %%i in (%temp%\temp.txt) do echo %time%;%date%;%computername%;%%i >> %computername%_File.csv
    del %temp%\temp.txt
    

    对此有一个限制:变量不能包含多行。但是,将脚本片段改写为循环也可能会解决该问题。

    MSDN article on set 显示了一些附加功能,您可以使用这些功能来控制如何解析文件中的数据。通常它将结果解析为由空格分隔的标记。但是您可以使用 delims 关键字覆盖它。

    【讨论】:

    • 感谢您的回答。尝试您的解决方案时,如果 %%i 包含空格,则结果在我的 csv 文件中被截断。有没有办法不必创建临时文件(因为之前有另一个循环,我认为这不是最有效的方法)?
    • 您可以通过引用来解决这个问题(不确定没有一些测试)。使用临时文件是因为set 命令无法读取命令的输出(最接近的是/p 选项,这似乎不是解决问题的方法)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多