管理员使用双引号参数批处理文件的快捷方式

时间:2010-03-23 06:53:26

标签: windows batch-file shortcut administrator double-quotes

采取一个极其简单的批处理文件:

echo hi
pause

将其另存为test.bat。现在,创建test.bat的快捷方式。快捷方式运行批处理文件,打印“hi”然后按预期等待按键。现在,向快捷方式的目标添加一些参数。现在您有一个快捷方式:

%path%\test.bat some args

快捷方式像以前一样运行批处理文件。

现在,以管理员身份运行快捷方式。 (顺便说一下,这是在Windows 7上。)您可以使用右键单击 - >以管理员身份运行,或转到快捷方式的属性,然后选中高级部分中的框。告诉UAC没关系,快捷方式再次按预期运行批处理文件。

现在,更改快捷方式目标中的参数以添加双引号:

%path%\test.bat "some args"

现在以管理员身份尝试快捷方式。这次不行!弹出一个命令窗口,并且消失得太快,无法看到任何错误。我尝试添加> test.log 2>& 1到快捷方式,但在这种情况下不创建日志。

尝试运行相同的快捷方式(使用双引号)但不是管理员。它运行批处理文件很好。因此,似乎行为不是因为双引号参数,而是因为它以管理员身份运行。这是两者的奇怪组合。

我也尝试从管理员的命令窗口运行相同的命令。这按预期运行批处理文件而没有错误。从命令窗口运行快捷方式产生了一个新的命令窗口,该窗口闪烁并消失。显然,这个问题是由管理员,快捷方式和双引号组合引起的。

我完全难过,有没有人知道发生了什么?我也想要一个解决方法。

6 个答案:

答案 0 :(得分:5)

我刚刚运行了Process Monitor,这就是我所看到的:

以用户身份运行:

cmd /c ""C:\Users\Sunbelt\Desktop\test.bat" "some args""

以管理员身份运行:

"C:\Windows\System32\cmd.exe" /C "C:\Users\Sunbelt\Desktop\test.bat" "some args"

由于某种原因,Run as Admin案例不引用整个命令。它似乎正在尝试运行命令:

C:\Users\Sunbelt\Desktop\test.bat" "some args

我猜想,因为第一个空格被引用,它实际上试图运行以下命令:

"C:\Users\Sunbelt\Desktop\test.bat some" args

在Process Monitor日志中,“C:\ Users \ Sunbelt \ Desktop \ test.bat some”的文件系统条目为“NO SUCH FILE”。我不知道为什么在以管理员身份运行时会有所不同,但这似乎正在发生。

答案 1 :(得分:3)

要解决此问题,请在没有空格的路径上创建另一个bat文件,并使用不带空格的文件名,只需执行此操作:

call "Long path to original bat file\Original bat file.bat"

此辅助bat文件可以作为admin运行。

您现在可以创建此辅助bat文件的快捷方式,并在快捷方式的高级选项中选中以admin身份运行。快捷方式可以放在带空格的路径上,它可以有一个包含空格的文件名。

答案 2 :(得分:0)

在我的情况下,我只想传递一个文件名作为参数,但路径有空格。

我找到了适用于此案例的解决方案(如果可以截断文件名)。

使用CALL.exe的语法创建另一个bat文件(input_gate.bat)以删除路径中的空格。 假设快捷方式名为test.lnk,并且与input_gate.bat在同一路径上:

call %~sdp0test.lnk %~sf1

这个传递作为参数以test.bat的短文本格式,具有管理员权限。

  • %~sdp0 - >当前路径(对于input_gate.bat)是否为短格式。
  • %~sf1 - >是第一个传递给input_gate.bat的参数(在我的例子中是带有空格的完整文件名)

答案 3 :(得分:0)

这在Windows 7中对我有用:

ShortcutTarget: C:\Windows\System32\cmd.exe /C myscript.bat Param1 "Param Two with spaces"
StartIn:        "C:\Path containing\my script"

尚未作为管理员尝试过。如果myscript.bat包含空格

,我认为它不会起作用

答案 4 :(得分:0)

我终于想出来了,允许使用长文件名(短文件名不适合我的用例)。我的解决方案适用于Win 7,8和10.我认为它的灵感来自Luke提到的缺失双引号。

这是:

1.。)对于您创建的批处理文件的快捷方式,您设置为以admin身份运行,请使用以下命令行:

cmd /s /c ""path_to_batch_file"

请注意,命令开头有2个双引号字符,最后只有1个,即使 通常最后为2也。但这是让它发挥作用的诀窍!

2.。)在批处理文件中,添加缺少的双引号字符:

set user_file=%1"


那就是它!这是一个让你在行动中看到它的例子:

1。)在桌面上,创建" test.bat"具有以下内容:

@echo off
set user_file=%1"
echo The file is: %user_file%
pause

3.。)创建批处理文件的快捷方式。将其设置为以管理员身份运行,并为其指定以下命令行:

cmd /s /c ""%userprofile%\desktop\test.bat"

4.。)将文件拖到快捷方式上。成功! (我希望......)

答案 5 :(得分:0)

这里的答案对我有用:https://superuser.com/questions/931003/passing-variables-with-space-to-the-command-line-as-admin

哪个是......

目标之前添加 try { KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDSA", "BC"); SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); ECGenParameterSpec ecSpec = new ECGenParameterSpec("prime192v1"); // Initialize the key generator and generate a KeyPair keyGen.initialize(ecSpec, random); // 256 bytes provides an // acceptable security level KeyPair keyPair = keyGen.generateKeyPair(); // Set the public and private keys from the keyPair privateKey = keyPair.getPrivate(); publicKey = keyPair.getPublic(); System.out.println("Private and public keys:"); System.out.println("PRIVATE: " + StringUtil.getStringFromKey(this.privateKey)); System.out.println("PUBLIC: " + StringUtil.getStringFromKey(this.publicKey)); } catch (Exception e) { throw new RuntimeException(e); } 。 我还必须确保我的脚本的名称和路径没有空格,cmd /C引用目标中脚本的路径。