【发布时间】:2021-11-07 22:35:42
【问题描述】:
我正在使用 system api 来调用 powershell 脚本,并且该脚本没有将 errno 设置为任何值,如果命令执行是成功还是失败,它不会给我提示。
下面是我的powersehll脚本,它只是设置退出代码,但是当我使用c++系统api调用这个脚本时,这个退出代码没有设置。
test.ps1
#-------------------------------------------------------------------------------
function ExitWithCode {
#-------------------------------------------------------------------------------
param($exitcode)
$host.SetShouldExit($exitcode);
exit
}
ExitWithCode -exitcode 1
使用 c++ 程序执行脚本
string cmd = "";
std::getline(cin, cmd);
errno = 0;
cout <<" system " <<cmd << " ------> " << endl;
cout << system(cmd.c_str()) << " errno " << errno << endl;
c++ 程序的输出
powershell -ExecutionPolicy Unrestricted -File "C:\test.ps1"
system powershell -ExecutionPolicy Unrestricted -File "C:\test.ps1" ------>
0 errno 0
系统命令输出为 0,但 errno 设置为 0。知道为什么没有设置 errno 吗?
【问题讨论】:
-
程序或脚本的返回码为零通常表明它已成功。一个小的正数表示失败。此外,程序或脚本中发生了什么并不重要,
errnomigh 的值只有在std::system函数本身失败时才被设置。这并不表示您执行的程序或脚本有错误。 -
除此之外,除非记录了一个函数在成功时设置
errno的值,否则您应该只在函数失败后检查errno(并且还记录为设置@987654329 @)。如果函数没有失败,那么errno的值实际上是 indeterminate 并且不应检查。 -
std::system()是否应该设置errno? -
@Galik 似乎没有记录在案。虽然取决于所使用的操作系统,
std::system使用的功能可能会设置它。但现在在 Windows 上,需要检查GetLastError。但同样,只有在std::system函数本身失败时。 -
@Someprogrammerdude 我检查了 GetLastError 也将它设置为零。有没有其他方法可以知道调用者porgram的执行是否成功,可能使用_exec或_execp?
标签: c++ windows powershell system-calls