采取一个极其简单的批处理文件:
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到快捷方式,但在这种情况下不创建日志。
尝试运行相同的快捷方式(使用双引号)但不是管理员。它运行批处理文件很好。因此,似乎行为不是因为双引号参数,而是因为它以管理员身份运行。这是两者的奇怪组合。
我也尝试从管理员的命令窗口运行相同的命令。这按预期运行批处理文件而没有错误。从命令窗口运行快捷方式产生了一个新的命令窗口,该窗口闪烁并消失。显然,这个问题是由管理员,快捷方式和双引号组合引起的。
我完全难过,有没有人知道发生了什么?我也想要一个解决方法。
答案 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的短文本格式,具有管理员权限。
答案 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
引用目标中脚本的路径。