批处理脚本:尝试回显文件内容时输出为空

时间:2015-10-26 14:37:47

标签: batch-file wmic

我正在尝试遍历所有已安装的程序:

wmic /output:C:\temp\InstallList.txt product get name

for /F "tokens=*" %%G in (C:\temp\InstallList.txt) do echo %%G

创建了文件,但输出为空!

3 个答案:

答案 0 :(得分:0)

输出不为空。输出是Unicode。使用Mon, 26 Oct 2015 23:59:59 GMT 转换为当前的本地编码。

如果您希望从字符串末尾删除空格,请参阅How to remove trailing and leading whitespace for user-provided input in a batch file?

more

答案 1 :(得分:0)

可以在一个

中完成所有操作
FOR /F "skip=1 delims=" %%G in ('wmic product get name') do @echo %%G

答案 2 :(得分:0)

问题是wmic命令输出的Unicode格式。因此,您的文件InstallList.txt包含许多0x00字节,导致for /F循环终止。

要解决此问题,请使用wmic循环捕获for /F输出,以便将其转换为非Unicode格式:

@echo off
for /F "skip=1 delims=" %%G in ('
    wmic PRODUCT GET Name
') do echo %%G

skip=1选项会从输出中删除标题Name

不幸的是,输出仍然包含一些令人不安的假象(事实上,有一些孤立的回车)。要摆脱它们,嵌套另一个for /F循环:

@echo off
for /F "skip=1 delims=" %%G in ('
    wmic PRODUCT GET Name
') do (
    for /F "delims=" %%F in ("%%G") do echo %%F
)

当然你可以用InstallList.txt解析你的Unicode输出文件for /F,但你不能直接这样做,你需要使用type命令转换为非Unicode :

for /F "skip=1 delims=" %%G in ('
    type "C:\temp\InstallList.txt"
') do rem the rest is the same as above

您也可以使用more命令来实现这一目标,只需编写more代替type

您可能会注意到echo命令返回的每一行都包含尾随空格。如果他们打扰您,您可以使用以下代码:

@echo off
setlocal EnableDelayedExpansion
set "REPL=    "
for /F "skip=1 delims=" %%G in ('
    wmic PRODUCT GET Name
') do (
    for /F "delims=" %%F in ("%%G") do (
        set "LINE=%%F%REPL%"
        set "TRNC=!LINE:*%REPL%=%REPL%!"
        call echo %%LINE:!TRNC!=%%
    )
)
endlocal

我在这里做的是:

  • 在变量REPL中指定一个空格序列(在此示例中为4,假设每行在其感兴趣的部分中包含的空格较少);
  • 读取每一行,追加空格序列并将增强的行存储在LINE;
  • 检索每行尾随空格的实际序列(通过在REPL中查找序列)并将其存储在TRNC;
  • 用空格替换每行的实际空格序列,即截断它,然后实际输出剩余的字符串部分;

当然,如上所述,在解析文件InstallList.txt时也可以这样做。