从Powershell传递实际的返回码

时间:2019-04-22 16:59:35

标签: powershell

我有一个命令行exe实用程序,需要使用嵌入式密码才能调用。显然,这并不理想,因此我创建了一个PS包装器来对密码进行加密并存储/从PSCredential对象调用它。

所有这些都工作正常,但是我需要错误处理。如我所见,如果我在脚本的末尾添加exit $LASTEXITCODE,我将得到一个简单的0或1。此实用程序将返回码用于需要不同处理的场景,但实际上并非全部错误。如何返回实际的数字代码?

编辑:感谢您的答复。因此,问题在于调用过程没有获取返回码。

PS脚本基本上只是&"C:\blah.exe",后跟exit $LASTEXITCODE。它不在函数中。

当我从PS运行它时,我得到正确的代码,但是当我从外部调用它时,即使我仍然获得正确的状态(0或1),我也没有。

PS C:\Powershell> .\RunTask.ps1 454713613
ErrorCode: 2
NominalStart: 2019-04-22 12:20:53.87
TimeEnded: 2019-04-22 12:20:56

PS C:\MoveIT_API\Powershell> $LASTEXITCODE
2
PS C:\MoveIT_API\Powershell> exit

C:\Powershell>powershell .\RunTask.ps1 454713613
ErrorCode: 2
NominalStart: 2019-04-22 12:22:51.98
TimeEnded: 2019-04-22 12:22:54

C:\Powershell>echo %ERRORLEVEL%
1

2 个答案:

答案 0 :(得分:1)

这是一个两步过程。首先,在PowerShell包装脚本中,您需要通过从.exe实用程序中退出$LASTEXITCODE来返回$LASTEXITCODE,例如

$exe = "myExe.exe"
$ArgumentList = "/arst"

& $exe $ArgumentList

$Result = $LASTEXITCODE

#....

Exit $Result

您必须在包装脚本中执行此操作,因为{em>是 -wrapper-脚本成功运行,$LASTEXITCODE始终为0/1。通过显式退出代码,您可以控制退出代码。

等式的第二部分是如何调用PowerShell,因为对-Powers.exe的成功调用将始终返回1/0,因为-yes- PowerShell.exe可以成功运行,尽管您使用了脚本。因此,要解决此问题,请执行以下操作:

powershell.exe -Command ". C:\MyScript.ps1; exit $LASTEXITCODE"

这告诉PowerShell.exe执行命令MyScript.ps1,并使用脚本的退出代码显式退出PowerShell。

答案 1 :(得分:0)

仔细检查您是否正确输出了错误代码。莱姆解释...

$LASTEXITCODE包含最后一个Win32可执行文件执行的退出代码;类似于%ERRORLEVEL%。

我有一个名为“ sample.exe”的命令行实用程序,它将一个整数值作为参数并将其作为退出代码返回:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace sample
{
    class Program
    {
        static void Main(string[] args)
        {

            System.Console.WriteLine("Running...");

            int returnCode = 0;

            try
            {
                if (args.Length > 0)
                {
                    returnCode = int.Parse(args[0]);
                }
            } finally
            {
                Environment.Exit(returnCode);
            }
        }
    }
}

当我叫$LASTEXITCODE时,这就是我得到的:

call_to_last_exit_code