我的Windows批处理文件应该由用户 不带 管理员权限启动。在某个步骤中,它应该使用提升的权限来调用自己。我已经学习到可以使用PowerShell的
不幸的是,我无法从具有提升权限的批处理执行中接收退出代码。即使没有任何错误消息,我始终得到
我相信,我已经尝试了所有类似问题的大量建议答案,但显然无法解决问题。我需要建议。
MVE 应该指示提升的批处理返回
runas
功能实现这一点(batch.bat ⭢ PowerShell ⭢ batch.bat)。这个方法非常有效。不幸的是,我无法从具有提升权限的批处理执行中接收退出代码。即使没有任何错误消息,我始终得到
1
。我不知道退出代码在哪个阶段丢失了,是第一步(批处理返回给PowerShell)还是第二步(PowerShell返回给批处理)。我相信,我已经尝试了所有类似问题的大量建议答案,但显然无法解决问题。我需要建议。
MVE 应该指示提升的批处理返回
0
:@echo off
echo param=%~1
openfiles /local >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
echo elevated, exit 0
pause
exit 0
) ELSE (
echo not elevated. trying to elevate.
powershell start-process -wait -verb runas '%0' -argumentlist /foo
echo powershell returned %errorlevel%.
)
需要注意的是(已编辑以消除误解):虽然由用户进行的非提升调用不需要任何参数,但提升调用会引入一个额外的参数“/foo”。这让我感到更加困难,因为我没有找到不失去此参数的解决方案。不过,这似乎是一个相当不寻常的用例。
EnableDelayedExpansion
以使示例“最小化”,因为“发现”它没有影响。我注意到我错了。接下来,我从您的答案和您在另一个问题中的帖子中学到了bbb(批处理初学者错误)并需要感叹号扩展。然而,我不喜欢提出的解决方案,因为对我来说似乎有些hacky,但是好吧。至少它起作用了,这很棒! - Twonkypowershell ... -PassThru
但结果并没有改善。 - jeb_exitcode.tmp
移动到%temp%
并使用IF EXISTS
保护set
命令。认为这个解决方案已经足够好了!谢谢,你太棒了! - Twonky