这里的第一篇文章,如果我不这样做,请道歉。
我正在尝试在远程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
输出正在发生?
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
将它传递给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
我建议
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
- 你会发现q
被j
覆盖)
因此,要捕获第一行,set
变量为空,然后在for
循环set
它到你想要捕获的值,但用set
来控制if not defined
。
@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%]