6

我有一个批处理文件,它使用这个习语(很多次)将注册表值读入环境变量:

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)获取到环境变量中的更直接方法也将很有用。

4

4 回答 4

1

哇,这很奇怪。

如果相同的命令在分成两行时起作用,那么我猜这与命令在 FOR 命令的子外壳中运行的方式有关。

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

或者也许从简单开始并尝试通过 CMD /C 运行 REG 命令以查看是否有任何作用?

在这里快速猜测一下,COMSPEC 和 SHELL 的值是多少?

于 2008-10-09T04:08:47.870 回答
1

我会检查:

  1. 客户在机器上的角色——他们是管理员吗?
  2. 盒子上的 reg.exe 在哪里 - 路径中是否有多个 reg.exe 的副本?
  3. 客户机器上的区域设置与正常工作的机器有什么区别吗?

基本上,列举这台机器和它按预期工作的机器之间的所有不同之处。包括服务包、域成员资格等。

于 2008-10-08T16:04:08.240 回答
1

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

于 2011-12-16T00:10:34.803 回答
0

/F开关需要打开命令扩展。通常默认情况下它们是打开的,但我会检查一下。在 XP 系统上,您可以打开它们做类似的事情

cmd /e:on

或检查下的注册表

HKCU\Software\Microsoft\Command Processor\EnableExtensions

不知道 Windows Server。

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

于 2008-10-08T15:47:25.667 回答