我有一个命令行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
答案 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
时,这就是我得到的: