如何以admin

时间:2017-06-17 03:03:53

标签: windows powershell batch-file cmd

当以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

我不想要那个。你能帮帮我吗?

1 个答案:

答案 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

==>

<强>解释

Exit Codes

  

在PowerShell $?中包含True,如果上次操作成功并且   否则False

     

最后一个Win32可执行文件执行的退出代码存储在   自动变量$LASTEXITCODE

     

要阅读退出代码(01除外),请启动PowerShell   脚本并将$LASTEXITCODE返回到一行中,如下所示:

powershell.exe -noprofile C:\scripts\script.ps1; exit $LASTEXITCODE

Start-Process

  

-PassThru

     

为每个进程返回一个System.Diagnostics.Process进程对象   该cmdlet已启动。默认情况下,此cmdlet不会生成任何内容   输出

     

-Wait

     

表示此cmdlet等待指定的进程完成   在接受更多输入之前。此参数禁止该命令   提示或保留窗口,直到过程结束。

(call ):Dave Benham回复将ERRORLEVEL设置为0 问题:

  

如果您想强制errorlevel0,那么您可以使用此功能   完全不直观但非常有效的语法:(call )。空间   在调用之后是至关重要的。如果您要将errorlevel设置为1,   你可以使用(call)。至关重要的是,之后没有任何空间   呼叫