【问题标题】:Set Variable to value of command将变量设置为命令的值
【发布时间】:2016-08-03 11:55:03
【问题描述】:

我需要将 WMIC COMPUTERSYSTEM GET MODEL /Value 的值设置为一个变量。当我运行此命令时,我得到以下结果。为什么会出现多余的空行?

U:\>for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do set output=%i
 :\>set output=
 :\>set output=
 :\>set output=Model=HP ProDesk 600 G1 SFF
 :\>set output=
 :\>set output=
 :\>set output=

【问题讨论】:

  • @jeb,我认为输出中缺少的驱动器号 U 是复制和粘贴错误,这就是我(重新)插入它们的原因(匆忙);控制台上的真实输出通常还会在每个相邻回声之间包含空行;无论如何,我要求 OP 向我们展示真实的输出......
  • @aschipfl 我在编辑之前测试了它,因为我一开始也认为他只是错过了U:>,但我错了
  • 啊,是的,@jeb,似乎每一行都以回车和空格结尾...

标签: batch-file cmd


【解决方案1】:

这是 WMIC 输出的问题,其中包含 carriage return 字符。
因此空行不会被删除,因为它们不是完全空的。

回车也是:>而不是U:>的奇怪输出的原因,因为回车首先将光标移动到POS1,然后一个空格删除了U

使用额外的 FOR/F,您可以去除回车符

for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do @(
    for /F "delims=" %X in ("%i") do set output=%X
)

顺便说一句。通常,您希望在批处理文件中使用这样的表达式,而不是在命令行中。
然后你必须将其转换为

@echo off
for /f "delims=" %%i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do (
    for /F "delims=" %%X in ("%%i") do set output=%%X
)

【讨论】:

  • 更准确地说,我认为问题是由于 WMIC 以 UTF-8 输出,而内部命令需要 ANSI。 SO上的许多帖子都涉及该主题。也就是说,@jeb 的解决方案运行良好。
  • 是的,你是对的,输出是UTF-8,这会导致回车问题,因为字节是00 CR 00 LF而不是CR LF
【解决方案2】:

为什么会有多余的空行?

因为WMIC 在其输出中打印了那些空行,而"FOR /F processing of a text file consists of reading the file, one line of text at a time and then breaking the line up into individual items"(强调我的)。

因此,即使您不定义任何分隔符,每一行仍会单独处理。

如果您的输出中不需要 Model=,您可以使用这个:

for /f "delims== tokens=2" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do set output=%i

【讨论】:

  • 我尝试了 'do set output=%output%%i' 但它没有设置我得到的值 U:\>echo %output% %output% U:\>echo %output% %i %输出%%i
  • @JohnRing 那是另一个问题,它与空行无关,你应该修改你的问题
【解决方案3】:

正如其他人已经提到的,问题是由于 WMIC 的 Unicode 输出造成的。 在您的情况下,您仍然可以使用以下命令将所有内容放在一行中:

for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value^|findstr /i "MODEL"') do @(set output=%i)

【讨论】:

    【解决方案4】:

    wmic 命令生成 Unicode 输出,for /F 存在问题,因此保留了不需要的伪像。事实上,这些都是孤立的回车字符。克服这个问题的最佳和最灵活的方法是嵌套另一个 for /F 循环,以便将 wmic 输出解析两次。

    以下命令行直接输入到控制台,相应的输出也会显示出来:

    U:\>for /F "delims=" %I in ('wmic ComputerSystem GET Model /VALUE') do @for /F "delims=" %L in ("%I") do set "output=%L"
    
    U:\>set "output=Model=HP ProDesk 600 G1 SFF"
    
    U:\>
    

    要在批处理文件中使用上述命令行,您需要将百分号加倍:

    @echo off
    for /F "delims=" %%I in ('wmic ComputerSystem GET Model /VALUE') do (
        for /F "delims=" %%L in ("%%I") do set "output=%%L"
    )
    echo %output%
    

    要从变量 output 的值中去除 Model= 前缀,请将脚本更改为:

    @echo off
    for /F "tokens=1,* delims==" %%I in ('wmic ComputerSystem GET Model /VALUE') do (
        for /F "delims=" %%L in ("%%J") do set "output=%%L"
    )
    echo %output%
    

    双重解析方法其实归功于dbenham——见他对Why is the FOR /f loop in this batch script evaluating a blank line?的回答以及他的外部文章WMIC and FOR /F : A fix for the trailing <CR> problem

    【讨论】:

      猜你喜欢
      • 2014-05-26
      • 1970-01-01
      • 2012-09-27
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多