Windows 上的 PowerShell:如果使用输出重定向参数,Start-Process 会失败

Windows 上的 PowerShell:如果使用输出重定向参数,Start-Process 会失败

如果指定了或者,为什么Start-Process找不到可执行文件(不在路径中) ?-RedirectStandardOutput-RedirectStandardError

IE

[X:\] Start-Process -FilePath "prog.exe" -WorkingDirectory (Get-Location).Path

程序按预期启动并执行。但是当我添加输出重定向时,一切都崩溃了:

[X:\] Start-Process -FilePath "prog.exe" -WorkingDirectory (Get-Location).Path -RedirectStandardOutput stdout.txt
Start-Process: This command cannot be run due to the error: The system cannot find the file specified.

通过操作员进行的重定向1>stdout.txt按预期工作。

这似乎不会影响 中列出的目录中的程序PATH。我真的不明白这里的逻辑是什么。重定向应该与解析二进制路径无关。

在 Windows 10 Professional 上运行。

更新:完整追踪和简单再现

PS> cat .\hello.c
#include <stdio.h>

int main(int argc, char** argv)
{
        printf("Meh\n");
        getchar();
        return 0;
}

PS> cl hello.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.29.30138 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

hello.c
Microsoft (R) Incremental Linker Version 14.29.30138.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:hello.exe
hello.obj

PS> Start-Process -FilePath hello.exe -WorkingDirectory (Get-Location).Path

PS> Start-Process -FilePath hello.exe -WorkingDirectory (Get-Location).Path -RedirectStandardOutput stdout.txt
Start-Process : This command cannot be run due to the error: The system cannot find the file specified.
At line:1 char:1
+ Start-Process -FilePath hello.exe -WorkingDirectory (Get-Location).Pa ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationException
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand

更新 2

似乎对可执行文件使用绝对路径是解决该问题的方法。(尽管它首先没有解释为什么输出方向会破坏可执行文件名称/路径解析)

答案1

获取可执行文件的完整路径。

查看我的屏幕主持人

我没有完整的解释......但我记得它与 c++ 中的 ShellExecute 和 CreateProcess 有关

https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw

https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutew

我最好的猜测是 shellexecute 是问题所在。您可以在文档中找到。

ShellExecute(handle, NULL, <fully_qualified_path_to_folder>, NULL, NULL, SW_SHOWNORMAL);

Redirect 参数可能会更改底层调用。请参阅 .NET 等效项。

https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.useshellexecute?view=net-6.0

相关内容