2015-05-06 43 views
1

我想用这个信息创建一个日志文件: echo%time%;%date%;%computername%;“findstr/I”%% a“%MYFILES%\ Dir_ALL.txt”>>%computername%_File .csv如何在同一个“回声”行中插入命令结果?

我该如何写一些不会写“findstr/I ...”但是这个命令的输出?

我想在我的输出文件的同一行中包含所有内容。

谢谢

回答

1

您必须使用命令结果设置一个变量。这在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关键字覆盖它。

+0

谢谢你的回答。在尝试解决方案时,如果%%包含空格,则结果会在我的csv文件中截断。有没有办法创建一个临时文件(因为之前有另一个循环,我认为这不会是最有效的方法)? – Isabelle

+0

您可以通过引用(不确定而无需进行一些测试)来解决该空间。使用临时文件是因为'set'命令无法读取命令的输出(最接近'/ p'选项,这似乎不是解决问题的方法)。 –

1

写而不set /p换行线,接着是第二行:

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

注意:由于%%a我猜,您使用的是for声明这里面codefragment。我建议使用!time!而不是%time%来获得实际时间(使用延迟扩展当然)

+0

谢谢,我会尝试。你能告诉我为什么我需要使用“!”而不是“%”,如果我在“FOR”声明中? (对于我的noob问题抱歉)。 – Isabelle

+0

没问题。整个'for'语句立即被解析,所以'%time%'不会改变(如果你循环一段时间,可能会有问题),每次都会计算'!time!'。参见[这里](http://stackoverflow.com/a/26786046/2152082)或[这里](http://stackoverflow.com/a/20854972/2152082)进行演示。 – Stephan

相关问题