我正在尝试遍历所有已安装的程序:
wmic /output:C:\temp\InstallList.txt product get name
for /F "tokens=*" %%G in (C:\temp\InstallList.txt) do echo %%G
创建了文件,但输出为空!
答案 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
时也可以这样做。