对于具有wmic不需要的输出的/ F.

问题描述 投票:1回答:4

这里的第一篇文章,如果我不这样做,请道歉。

我正在尝试在远程Windows PC上输出操作系统版本,但我不断收到不需要的数据。执行此批处理文件:

@echo off
set /p hostname=PC hostname?
echo.
FOR /F "skip=1 tokens=*" %%A in ('wmic /node:%hostname% OS get caption') DO echo %%A
echo.
pause

返回此结果:

Microsoft Windows 7 Professional
Echo is off.

我能够使用Caption删除skip=1输出,但我不明白echo命令来自哪里。拆分命令没有帮助,但转向回显示,显然,循环的wmic命令在输出操作系统版本后输出echo,所以,显然,当echo关闭时,我得到最终输出:Echo is off。任何人都可以帮助我理解为什么echo输出正在发生?

batch-file echo wmic
4个回答
2
投票

Magoo确定了问题的根源 - 将WMIC unicode输出转换为ANSI是有缺陷的,因为每一行都以CRCRLF而不是正常的CRLF结束。

FOR / F在每个LF中断(并剥离),留下CRCR。当且仅当它恰好是CR时,FOR / F从每一行中删除最后一个字符,这样在每行的末尾留下一个CR。 FOR / F忽略空行,但CR不是空行,因此不需要的Echo is off.输出。

Magoo和Squashman为您的问题提供了可行的解决方案,但它们不是适用于所有FOR / F-WMIC情况的通用解决方案。当FOR / F输出存储在变量中时会出现一个常见问题 - 不需要的CR通常位于值的末尾,这可能会导致以后出现问题。

我们可以使用已知的FOR / F机制,通过简单地添加额外的FOR / F来从每一行中去除不需要的CR。

所以总是有效的通用模板看起来像

for delims^=^ eol^= %%. in ('wmic ....') do for /f "whatever options you need" %%A in ("%%.") do ...

或者如果你需要跳过N行,那么

for skip^=N^ delims^=^ eol^= %%. in ('wmic ....') do for /f "whatever options you need" %%A in ("%%.") do ...

第一个FOR / F中的神秘语法将DELIMS和EOL都设置为空。如果你知道你的输出都不是以;开头的,那么你可以简单地使用"delims=""skip=N delims="。在您的情况下就是这种情况。

所以解决方案变成:

for /f "skip=1 delims=" %%. in ('wmic /node:%hostname% OS get caption') do for /f "delims=" %%A in ("%%.") do echo %%A

1
投票

将它传递给find命令。

@echo off
set /p hostname=PC hostname?
echo.
FOR /F "tokens=1,2 delims==" %%A in ('wmic /node:%hostname% OS get caption /value ^|find /I "caption"') DO echo %%B
echo.
pause

1
投票

我建议

set "remotever="
FOR /F "skip=1 tokens=*" %%A in ('wmic /node:%hostname% OS get caption^|more') DO if not defined remotever set "remotever=%%A"
echo %remotever:~0,-1%

more是将wmic的unicode输出转换为ANSI的经典批处理方法。

但是有一个问题。除了Unicode之外,WMIC“结束”其行的CRCRLF而不是CRLF,倒数第二个CR然后包含在赋给变量的值中(因此echo子串不包括最后一个字符 - 你会发现一些尾随空格...... )。

(作为一个稍微简单的演示,尝试在你的原始echo q%%Aj - 你会发现qj覆盖)

因此,要捕获第一行,set变量为空,然后在for循环set它到你想要捕获的值,但用set来控制if not defined


0
投票
@echo off
for /f "usebackq delims= skip=1" %%a in (`wmic OS get caption 2^>nul ^| findstr "."`) do set caption=%%a
for /f "usebackq delims=" %%a in (`echo %caption%`) do set caption=%%a
set "caption=%caption:~0,-1%"
echo Caption=[%caption%]
© www.soinside.com 2019 - 2024. All rights reserved.