【问题标题】:Insert Input into a variable将输入插入变量
【发布时间】:2013-07-07 09:48:52
【问题描述】:

我正在编写一个批处理脚本来娱乐和学习。

我已经设置了多个选项,例如查找 IP 地址、MAC 地址……等等。 问题是我不知道如何将这两行的输出插入到变量中。

for /f "usebackq skip=1" %%f in (`wmic COMPUTERSYSTEM get name`) do ???
for /f "usebackq skip=1" %%f in (`wmic COMPUTERSYSTEM get domain`) do ???

所以我可以在句子中使用输出;

您的 DNS 名称是 %dns_name_output%,您的域是 %domain_name_output%。

【问题讨论】:

  • 问题不在于将输出放入变量中,问题在于wmic 无法按预期工作。它在行尾有一些额外的CR,不知道到底是多少(1-3?)。
  • 我知道,这是 3 行。一上一下。但我现在解决了,避免使用 wmic。

标签: variables batch-file output


【解决方案1】:

试试这个:

for /f %%f in ("%computername%") do set "name=%%f"
for /f %%f in ("%userdomain%") do set "domain=%%f"
echo %name%  %domain%

【讨论】:

  • 谢谢,它使用变量效果更好。但我不得不使用 %userdomain% 而不是 %logonserver%。然后它工作得很好:)
  • 如果引用标准变量,为什么还要使用 FOR /F?直接使用标准变量,或者直接将值分配给新变量。
  • @dbenham 这只是为了向用户展示变量的赋值。否则你当然是对的,这是没有意义的。
【解决方案2】:

要捕获wmic 获取输出,请像这样使用/value 标志

for /f "tokens=2 delims==" %%A in ('wmic computersystem get name /value') do set "Name=%%A"
for /f "tokens=2 delims==" %%A in ('wmic computersystem get domain /value') do set "Domain=%%A"

【讨论】:

  • 几乎完美,除了分配的值最后会有一个隐藏的<CR> 字符。 <CR> 字符将在正常的变量扩展时被剥离,但它可能会导致延迟扩展的问题。
  • @dbenham +1,很高兴知道。我知道隐藏角色,但不知道它会导致问题,因为我尝试不使用延迟扩展。它会导致什么问题?我只是猜测它会输出延迟扩展的隐藏字符,因为它发生在解释器验证命令之后。这是正确的吗?
  • 是的 - 这就是它可能导致延迟扩展问题的原因。当用作 IF 比较的一部分时,它可能特别讨厌。
【解决方案3】:

您看到的问题源于 WMIC 输出为 unicode 的事实。通过某种我不完全理解的机制(错误?),FOR / F 命令将 unicode 命令输出转换为 ASCII,但在每行的末尾神秘地附加了一个额外的回车符 (<CR>)。

FOR /F 不返回空行,但神秘且看似空白的行并不是真正的空白 - 它们包含<CR>

即使额外的行被正确忽略,列表中的最后一个值也会包含不需要的<CR>,在将值分配给环境变量时会包含该值。如果稍后使用%VAR% 正常扩展变量,<CR> 将不明显,因为命令解析器会自动去除所有<CR> 字符。但是<CR> 被保留,如果使用延迟扩展!VAR! 可能会导致问题。

如果恰好是<CR>,FOR /F 命令会从每行中删除最后一个字符。因此,通过额外的 FOR /F 传递值将消除问题。 David Ruhman 建议使用/value 开关是一个很好的建议,并且可以改进。一个循环可以请求多个值,属性名可以作为变量名。每行只有一个名称/值对消除了值中空格和/或逗号的潜在解析问题。

WMIC 命令中的逗号在 FOR /F 中使用时必须转义或引用。在这种情况下,引用整个命令似乎是最简单的。以下将正确定义两个环境变量 - 域和名称:

for /f "delims=" %%A in ('"wmic computersystem get domain, name /value"') do (
  for /f "tokens=1* delims==" %%B in ("%%A") do set "%%B=%%C"
)
echo Your host name is %name% and your domain is %domain%

【讨论】:

  • 非常感谢!如您所见,我不是最擅长批处理脚本的,所以我有最后一个问题:我如何将您组合的这两个字符串转换为我可以用来回显它的变量?我现在感觉有点笨,哈哈。
  • @MokiTa - ???字符串在变量中,所以我对你的问题有点困惑。但我更新了我的答案以显示结果变量的示例使用。
  • 啊,当然,哈哈!我怎么看不到。我真的很感激你甚至不厌其烦地回答我的愚蠢问题。谢谢!
【解决方案4】:

这使用 wmic 工作,没有嵌入任何奇怪的空格或 CR。

@echo off
for /f "tokens=2 delims=<>" %%a in ('wmic COMPUTERSYSTEM get name   /format:htable^|find "hidden"') do set "name=%%a"
for /f "tokens=2 delims=<>" %%a in ('wmic COMPUTERSYSTEM get domain /format:htable^|find "hidden"') do set "dom=%%a"
echo "%name%,%dom%"
pause

【讨论】:

    【解决方案5】:

    您可以定义一个变量,并使用反引号将其值分配给命令的结果。

    试试这个:

    a=`ls`
    echo $a
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 2018-01-06
      • 2012-07-19
      • 1970-01-01
      • 2015-02-02
      • 2015-12-21
      相关资源
      最近更新 更多