2008-10-08 19 views
6

我有一个使用这个成语(多次)来读取注册表值到一个环境变量的批处理文件:为什么迭代命令输出时批处理文件FOR失败?

FOR /F "tokens=2* delims= " %%A IN ('REG QUERY "HKLM\SOFTWARE\Path\To\Key" /v ValueName') DO SET MyVariable=%%B 

(有delims=后制表符)

这上千种工作正常客户的电脑。但在客户的一台计算机上(运行Windows Server 2003,命令扩展启用),它会因'REG QUERY“失败HKLM \ SOFTWARE \ Path \ To \ Key”/ v ValueName“不被识别为内部或外部命令,可操作程序或批处理文件“。单独运行“reg query”命令可以正常工作。 Reg.exe存在于C:\ Windows \ System32中。

我能够通过改变代码来解决此问题

REG QUERY "HKLM\SOFTWARE\Path\To\Key" /v ValueName > temp.txt 
FOR /F "tokens=2* delims= " %%A IN (temp.txt) DO SET MyVariable=%%B 

这引起了客户的启动和运行,但我想明白为什么这个问题发生,从而使我能够避免它在未来。

稍微偏离主要主题 - 将注册表值(字符串或DWORD)获取到环境变量中的一种更直接的方式也很有用。

回答

0

/F切换器需要打开命令扩展。通常他们默认打开,但我会检查。在XP系统中,您可以在

HKCU\Software\Microsoft\Command Processor\EnableExtensions 

打开它们做这样的事情

cmd /e:on 

或检查注册表说不上有关Windows Server。

help forhelp cmd也可以提供一些提示。

+0

我确实已验证EnableExtensions已设置。我会编辑这个问题来说明这一点。 – 2008-10-08 15:51:10

1

我会检查:

  1. 客户的作用,在机器上 - 他们的管理员吗?
  2. 框中的reg.exe在哪里 - 路径中是否有多个reg.exe副本?
  3. 客户的机器与正常工作的机器有区别吗?

基本上,列举一切不同之间的机器和它按预期工作的机器。包括服务包,域名成员等。

1

哇,那很奇怪。

如果相同的命令在分成两行时工作,那么我猜想它与命令在FOR命令的子shell中运行的方式有关。

如果你真的很想弄清楚为什么它在这种特殊情况下会死亡,你可以运行诸如“SET> envvars.txt”这样的命令作为FOR命令,并将它与顶层shell进行比较。

或者,也许开始简单,并尝试通过CMD/C运行REG命令,看看是否有什么做?

这里有一个快速猜测,COMSPEC和SHELL的价值是什么?

1

我有类似的情况。就我而言,这在COMSPEC中是一个不好的值。我解决了这个问题,脚本开始按预期工作。