当以admin身份执行时,我需要在批处理文件中捕获powershell脚本的输出。
示例:
ps1文件:
Write-Host "PS1 executed"
exit 1
如果我在没有管理员权限的情况下执行powershell脚本
NotAdminFile.bat:
@ECHO OFF
setlocal enableextensions
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '%~dpn0.ps1'"
echo %ERRORLEVEL%
endlocal
然后,输出
PS1 executed
1
这没关系。 但是,当我使用管理员访问权限执行powershell脚本时
AdminFile.bat:
@ECHO OFF
setlocal enableextensions
PowerShell.exe -NoProfile -Command "& {Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File "%~dpn0.ps1" ' -Verb RunAs}"
echo %ERRORLEVEL%
endlocal
然后,输出是:
0
我不想要那个。你能帮帮我吗?
答案 0 :(得分:5)
<强> exit_1_only.ps1 强>
Write-Host "executed: $($MyInvocation.Line)"
# pause
Exit 123+[int]([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::
GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")
<强> q44600354.bat 强>
@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
(call )
echo errorlevel clear=%errorlevel%
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command ^
"& 'D:\PShell\tests\exit_1_only.ps1'; exit $LASTEXITCODE"
echo errorlevel non-admin=%errorlevel%
echo(
(call )
echo errorlevel clear=%errorlevel%
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command ^
"& {exit ( Start-Process -Wait -PassThru -FilePath PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -Command ""D:\PShell\tests\exit_1_only.ps1; exit $LASTEXITCODE"" ' -Verb RunAs).ExitCode}"
echo errorlevel admin=%errorlevel%
<强>输出强>
==> D:\bat\SO\q44600354.bat
errorlevel clear=0
executed: & 'D:\PShell\tests\exit_1_only.ps1'; exit $LASTEXITCODE
errorlevel non-admin=123
errorlevel clear=0
errorlevel admin=124
==>
<强>解释强>
在PowerShell
$?
中包含True
,如果上次操作成功并且 否则False
。最后一个Win32可执行文件执行的退出代码存储在 自动变量
$LASTEXITCODE
要阅读退出代码(
0
或1
除外),请启动PowerShell 脚本并将$LASTEXITCODE
返回到一行中,如下所示:powershell.exe -noprofile C:\scripts\script.ps1; exit $LASTEXITCODE
-PassThru
为每个进程返回一个
System.Diagnostics.Process
进程对象 该cmdlet已启动。默认情况下,此cmdlet不会生成任何内容 输出
-Wait
表示此cmdlet等待指定的进程完成 在接受更多输入之前。此参数禁止该命令 提示或保留窗口,直到过程结束。
(call )
:Dave Benham回复将ERRORLEVEL设置为0 问题:
如果您想强制
errorlevel
到0
,那么您可以使用此功能 完全不直观但非常有效的语法:(call )
。空间 在调用之后是至关重要的。如果您要将errorlevel
设置为1
, 你可以使用(call)
。至关重要的是,之后没有任何空间 呼叫