【问题标题】:Errno is not set using c++ system api while invoking powershell script调用 powershell 脚本时未使用 c++ 系统 api 设置 Errno
【发布时间】: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 吗?

【问题讨论】:

  • 程序或脚本的返回码为零通常表明它已成功。一个小的正数表示失败。此外,程序或脚本中发生了什么并不重要,errno migh 的值只有在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


【解决方案1】:

PowerShell 中的exit 关键字默认将返回码设置为0。由于您只是在没有参数的情况下调用exit,因此返回码将始终为0。将您的功能更改为:

#-------------------------------------------------------------------------------
function ExitWithCode {
#-------------------------------------------------------------------------------
  param($exitcode)
  exit $exitcode
}
ExitWithCode -exitcode 1

或者不要重新发明轮子,直接调用:

exit 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 2018-07-31
    • 2010-11-28
    • 2011-08-06
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多