【发布时间】:2021-11-24 05:26:47
【问题描述】:
我正在创建一个 dos 批处理脚本 (cmd.exe) .cmd,它通过 powershell 将自己提升为管理员。
但如果它存储在名称中同时包含空格和 & 符号的文件夹中,它就不起作用了。
我不是专家,所以我搜索了网络,但找不到解决问题的解决方案或文档。所以我也想知道如何调试这种特殊情况和问题的可能解决方案,以及在哪里可以找到描述解决方案的文档或到达那里的步骤..(如果有的话)。
重现问题:我在桌面下创建了一个名为“Pie & tea”的文件夹,没有引号。在文件夹中,我创建了一个脚本“test.cmd”,在其中我只放了重现问题的必要条件。这是脚本的内容:
@echo off
pause
PowerShell start "%~f0" -verb runas
pause
goto: eof
我通过双击来运行脚本(这是所需的模式)。此代码显示错误(我使用翻译器从意大利语翻译):
Press any key to continue. . .
In row: 1 car: 34
+ start C:\Users\fposc\Desktop\Pie & tea\test.cmd -verb runas
+ ~
Ampersand (&) not allowed. The & operator is reserved for future use. Use "&" to pass the ampersand as
string.
+ CategoryInfo: ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId: AmpersandNotAllowed
Press any key to continue. . .
并按照一些说明,我通过将双引号增加了三倍,使用 powershell 修改了代码行:
PowerShell start """%~f0""" -verb runas
但是 cmd 窗口打开,在按下空格后 UAC 启动并在同意后另一个窗口出现了一会儿,但它立即关闭,我看不到任何错误。
我在网上看到任何使用单引号' 或powershell 转义字符` 或dos 批处理的插入符号^ 或powershell 的--% 参数等的解决方案。
但我无法解决。
我没有把所做的尝试放在这里,因为我以一种愚蠢的方式复制(因为我不熟悉混合 cmd / powershell 操作)并且我结合各种解决方案进行了无数次随机尝试。没有任何积极的结果。
我还看到了我想评估的解决方案,例如:
- 更改目录并使用相对路径。
- 准备字符串变量并替换字符。
- 使用 powershell -encodedcommand 传递参数。
但首选的解决方案是解释如何在单行代码
PowerShell start "%~f0" -verb runas上转义字符以及如何到达那里以及参考文档。
访问的一些链接:
VBS Shell.Application and PowerShell Start-Process do not escape ampersands internally
Quoting issues with PowerShell
Issues on windows when the username contains &
Executing PowerShell script via explorer context menu on items containing ampersands in their names
Stackoverflow: batch file deal with Ampersand (&) in folder name
Stackoverflow: How to access file paths in PowerShell containing special characters
Stackoverflow: How to pass strings to powershell from cmd with ampersands in values?
【问题讨论】:
-
使用
-File参数后是否还有同样的效果?PowerShell -File "%~f0" -
@Abraham Zinala。我试过了,但
-File参数说它只接受 powershell .ps1 脚本。该脚本是一个 .cmd,并给出错误:Unable to process -File 'C:\Users\fposc\Desktop\Pie & tea\test.cmd'. The file has no 'ps1' extension. Please provide a valid Windows PowerShell script file name and try again.我不知道如何使用-File提升 -
为什么要用cmd启动powershell来启动.bat文件?
-
@Theo,因为我上面写的脚本是用dos批处理写的。
-
.cmd 脚本检查是否被提升。如果没有提升,它会通过 powershell 自动提升。
标签: windows powershell batch-file cmd