在我的公司,我们有一个工具,基本上是让用户选择登录哪个网站,然后该工具将部署正确的注册表文件,其中包含有关用户选择的网站的设置。注册表文件使用 Microsoft Endpoint Manager 部署在C:\Program Files\MyCompany\site1.reg
32 位计算机或C:\Program Files (x86)\MyCompany\site1.reg
64 位计算机上的用户计算机上。该工具用于reg.exe
导入指定的文件,到目前为止,它从C:\Progra~1\MyCompany\site1.reg
32 位计算机和C:\Progra~2\MyCompany\site1.reg
64 位计算机的路径加载注册表文件,但是出于安全考虑,我们现在被迫使用注册表文件的完整固定路径,而不是旧路径。
但是简单地用和替换C:\Progra~1
或C:\Progra~2
不起作用C:\Program Files\
,C:\Program Files (x86)
我认为关键是Program Files
reg import
即使放在引号中也无法加载 reg 文件,C:\Program Files\MyCompany\site1.reg
因为我们的工具已经使用引号来调用代码reg import
片段,所以最后执行的命令看起来像是"reg import "C:\Program Files\MyCompany\site1.reg""
引发语法错误。
我尝试过了:
- 使用双引号(例如命令 ran is
reg import "C:\Program Files\MyCompany\site1.reg"
->)不起作用,因为我觉得我们的工具正在调用reg.exe
然后作为参数传递,"import "C:\Program Files\MyCompany\site1.reg""
因此双引号会引发语法错误。 - 将“Program Files”中的空格转义为
reg import C:\Program^ Files\MyCompany\site1.reg
- 使用
%ProgramFiles%
and%ProgramFiles(x86)%
但reg.exe
似乎无法解决这些环境变量。在我看来,这是最好的选择。
总而言之,似乎 reg.exe 在解析脚本传递的参数时遇到了困难。这在某处有记录吗?您有什么线索吗?
谢谢
答案1
这里的问题可能不是空格,而是 .reg 文件解释文件夹路径的方式。在引用 reg 文件中的位置时,请尝试添加双反斜杠而不是单反斜杠。
例子:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"TestKey"="C:\\Program Files\\Application\\app.exe"
编辑:网站在发布时将我的双反斜杠改为单反斜杠,因此可以用不同的方式写出来。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"TestKey"="C:DOUBLEBACKSLASHProgram FilesDOUBLEBACKSLASHApplicationDOUBLEBACKSLASHapp.exe"
答案2
从我们目前获得的信息来看,现有的机制显然并不理想,但也不是不可能解决。
到目前为止,我推断您的程序调用一个文件并随其发送一个参数。
因此,可以创建一个批处理脚本,作为链接来修复程序错误创建的问题。
如果我理解正确的话,C:\Program Files (或其 x86 对应项)\MyCompany 位置下有许多 .reg 文件,并且这些 reg 文件具有不同的名称。
该程序收集了 regfiles 可能拥有的所有名称,但无法启动正确的文件。
启动序列具有输入程序名称和参数的能力。
您尝试将 reg.exe 作为程序并将 -import path_to_reg.reg 作为 regfile,但失败了。
解决方案是创建一个或两个启动批处理文件作为程序和 regfiles 之间的链接。
如果您只能使用一个批处理文件,那么它将是这样的:
对于这个例子,我们假设我们称之为 SelectSite.cmd
:: -- Switch to 32 or 64bit mode
if %1==32 goto 32bit
if %1==64 goto 64bit
goto invalid
:32bit
cd /d C:\Program Files (86)\MyCompany
goto ImportReg
:64bit
cd /d C:\Program Files\MyCompany
goto ImportReg
:invalid
echo The first parameter should be 64 or 32.
goto end
:: -- Import whatever the name of the regfile is, that is the 2nd parameter.
:ImportReg
reg import %2
:end
在您的工具中,您选择程序名称:SelectSite.cmd
并
使用参数:32 "My Site.reg"
或64 MySite.reg
其中 32 或 64 表示 32 位或 64 位,第二个参数是 .reg 文件的名称。如果该文件有空格,则添加“”,否则它是可选的。
答案3
使用 %ProgramFiles% 和 %ProgramFiles(x86)%,但 reg.exe 似乎无法解析这些环境变量。在我看来,这是最好的选择。
使用变量作为程序文件文件夹(x86 / x64)的路径实际上是一种避免转义路径中空格的替代方法,但如果变量似乎没有从输入扩展为命令,您可以尝试“强制”这种扩展......
要通过输入“强制”扩展变量(已定义)%typed%
,您可以尝试使用call command %var%
,因为它已经提到在set /p
命令中发生。问题在这里,也从%path%
变量中尝试。
call %__AppDir__%reg.exe import "%ProgramFiles%\MyCompany\site1.reg"
call %__AppDir__%reg.exe import "%ProgramFiles(x86)%\MyCompany\site1.reg"
:: Or, using <con:
<con: call %__AppDir__%reg.exe import "%ProgramFiles%\MyCompany\site1.reg"
<con: call %__AppDir__%reg.exe import "%ProgramFiles(x86)%\MyCompany\site1.reg"
- 你有任何线索吗?
- 我想是这样..
但我更倾向于打赌你的工具设计时有最大字符串限制,因为改变的只是你的Progra~X
路径名。
请注意,尝试涉及长度的增加并且开始不再起作用,但除了使用/尝试在空间中逃逸之外,没有任何理由可以证明这一点,而且这也不起作用。
以下是对您在工具中输入的更改:
:: Your old command/input, total length of string input ::
reg import C:\Progra~1\MyCompany\site1.reg 42
reg import C:\Progra~2\MyCompany\site1.reg 42
:: Your current command/input, total length of string input ::
reg import %ProgramFiles%\MyCompany\site1.reg 45
reg import C:\Program Files\MyCompany\site1.reg 47
reg import "%ProgramFiles%\MyCompany\site1.reg" 47
reg import C:\Program^ Files\MyCompany\site1.reg 48
reg import "C:\Program Files\MyCompany\site1.reg" 49
reg import %ProgramFiles(x86)%\MyCompany\site1.reg 50
reg import "%ProgramFiles(x86)%\MyCompany\site1.reg" 52
reg import C:\Program Files (x86)\MyCompany\site1.reg 53
reg import "C:\Program Files (x86)\MyCompany\site1.reg" 55
如果您可以在另一个包含空格且总长度等于 42 的文件夹中进行测试,并且看到它可以正常工作,则表明空格不会干扰,并且当使用每次增加 1 个字符的文件夹名称重试时,直到停止工作并达到工具输入中可接受字符的限制...