在包含空格的文件夹的脚本中使用 reg.exe

在包含空格的文件夹的脚本中使用 reg.exe

在我的公司,我们有一个工具,基本上是让用户选择登录哪个网站,然后该工具将部署正确的注册表文件,其中包含有关用户选择的网站的设置。注册表文件使用 Microsoft Endpoint Manager 部署在C:\Program Files\MyCompany\site1.reg32 位计算机或C:\Program Files (x86)\MyCompany\site1.reg64 位计算机上的用户计算机上。该工具用于reg.exe导入指定的文件,到目前为止,它从C:\Progra~1\MyCompany\site1.reg32 位计算机和C:\Progra~2\MyCompany\site1.reg64 位计算机的路径加载注册表文件,但是出于安全考虑,我们现在被迫使用注册表文件的完整固定路径,而不是旧路径。

但是简单地用和替换C:\Progra~1C:\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 个字符的文件夹名称重试时,直到停止工作并达到工具输入中可接受字符的限制...


相关内容