【问题标题】:For /f is deleting the variable when set with the command used to set the variable对于 /f 正在使用用于设置变量的命令设置时删除变量
【发布时间】:2017-05-09 16:11:29
【问题描述】:

对不起,如果我让标题听起来有点混乱。但这就是我遇到的情况。

代码:

for /f "skip=1 tokens=1,3 delims=," %u in ('wmic /node:%CompName% COMPUTERSYSTEM GET USERNAME') do set userfound=%u

输出:

:\windows\system32>set userfound= domain\username
:\windows\system32>set userfound=

代码结果图片: Code Results

原代码:

wmic /node:%CompName% COMPUTERSYSTEM GET USERNAME

它的输出:

Username
domain\username

我想要做的是让一个变量只等于用户名,而没有为批处理文件添加域。稍后我会将该用户名保存为一个变量,该变量将保存在许多连接的批处理文件中。

我还想确保 for /f 不会循环(即使它是一个循环命令)不会用任何内容替换我的 var。

所以我不知道在这里编码什么。

想要的结果

[out put of code]=username

【问题讨论】:

  • 你需要在cmd.exe的上下文中查找“延迟变量扩展”的概念
  • 使用 SET ECHO OFF 然后再次运行 FOR 命令。当您想要返回提示时,请使用SET ECHO ON。您可能希望将其放入 .bat 文件脚本中。如果是这样,请确保将 FOR 循环 % 字符加倍。
  • 这在设置回显的情况下分批发生。结果仍显示为域\用户名
  • 回显变量 %Userfound% 时的最终结果基本上是 ECHO 关闭。
  • @MikeNakis,延迟扩展不是这里的解决方案,因为在for /F 循环中没有读取任何变量;问题是wmic 的Unicode 输出和for /F 对ANSI 文本的不良转换; npocmaka's answer 为此提供了完美的解决方案,使用两个嵌套的 for /F 循环来消除转换伪影...

标签: batch-file for-loop wmic


【解决方案1】:
for /f "delims=" %u in ('wmic /node:%CompName% COMPUTERSYSTEM GET USERNAME^|find "\"') do set userfound=%~nxu

tokens 不是必需的,skip 也不是。删除定界符(空定界符集)会将整行传递给%u

管道前面的插入符号转义它以表示它是要执行的命令的一部分,而不是for

find 命令只是过滤掉包含\ 的行。

u 之前的~nx 表示,将%u 中的名称视为文件名,只选择名称和扩展名(即最后\ 之后的部分)

【讨论】:

  • BTW - 数据似乎消失的原因是 wmic 的输出不是标准窗口 CRLF 终止的。它包括单独的 CR,cmd 解释一个新的(空)行。 (查看使用十六进制编辑器或十六进制查看器重定向到文件时的实际字节数)
  • 非常感谢,我一直在使用 for 命令尝试获得这个结果。这正是我所需要的。
【解决方案2】:

试试这样:

for /f "skip=1 tokens=1,3 delims=," %%u in (
    'wmic  COMPUTERSYSTEM GET USERNAME'
) do (
    for /f "tokens=* delims=" %%# in ("%%u") do set userfound=%%#
) 

echo %userfound%

【讨论】:

    猜你喜欢
    • 2018-02-25
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2018-11-18
    相关资源
    最近更新 更多