gpt4 book ai didi

c# - 退出代码 0 不显示 c# 中 ps1 文件的结果和传递参数

转载 作者:行者123 更新时间:2023-12-04 07:19:32 25 4
gpt4 key购买 nike

我正在尝试通过 PowerShell 在 C# 代码中运行 Windows Subsystem for Linux (WSL) 的一项功能。即使没有错误,我也看不到结果。为了解决这个问题,我在其他 stackoverflow 问题中阅读并实现了一些建议,但我仍然看不到结果。另一个问题是是否可以为以下代码传递参数。在 MS 网站中,没有关于传递参数的示例。我希望有办法做到这一点。
代码在这里:

PowerShell ps = PowerShell.Create();
ps.AddScript(File.ReadAllText(@"C:\Users\username\Desktop\test.ps1"));
ps.Invoke();
调试的输出是:
The thread 0x4034 has exited with code 0 (0x0).
The thread 0x4b34 has exited with code 0 (0x0).
The thread 0x4f0 has exited with code 0 (0x0).
The program '[18876] WSL_CS.exe' has exited with code 0 (0x0).
但是命令提示符打开和关闭的速度非常快。
在 PowerShell 中,当我运行以下代码时,我可以看到结果。
powershell -ExecutionPolicy Bypass -File test.ps1 5

最佳答案

如果你想要 启动一个可见的控制台窗口,该窗口执行脚本文件并保持打开状态 (脚本退出后进入交互式 session ):

  • 不要使用 PowerShell SDK 及其 PowerShell .NET 类:其目的是对 PowerShell 命令进行编程控制,不可见,交互式执行。
  • 相反,使用通用 Process 类来创建一个启动 PowerShell 的子进程 CLI在可见的控制台窗口中(默认情况下) :

  • System.Diagnostics.Process.Start(
    "powershell.exe", // The Windows PowerShell CLI
    @"-ExecutionPolicy Bypass -NoExit -NoLogo -File C:\Users\username\Desktop\test.ps1 5"
    ).WaitForExit();
    请注意如何在脚本文件路径(本例中为 5)之后指定传递给脚本文件的参数 - 确保根据需要对它们进行双引号,例如当它们包含嵌入空格时。
    自从 -File之后的一切( -f ) 被解释为脚本文件路径和传递给脚本的参数,确保将这些参数放在命令行的最后。
    或者,如果您正在创建 .NET 核心/.NET 5+ 应用程序,您可以单独指定所有参数,在这种情况下,.NET 会为您处理任何所需的双引号:
    System.Diagnostics.Process.Start(
    "powershell.exe", // The Windows PowerShell CLI
    new string[] {
    "-ExecutionPolicy",
    "Bypass",
    "-NoExit",
    "-NoLogo",
    "-File",
    @"C:\Users\jdoe\Desktop\pg\pg.ps1",
    "5" // Pass-through arguments.
    }
    ).WaitForExit();
    陷阱 :
  • -NoExit如果脚本文件传递给 -File,则不遵守找不到。
  • 这与将一段 PowerShell 源代码传递给 -Command 形成对比。 ( -c ) 参数,其中 -NoExit受到尊重,即使源代码的执行会导致错误)。
  • 这种差异可以说是一个错误,并已在 GitHub issue #10471 中报告。 .


  • 结果是,如果您不是从现有的控制台窗口启动该进程,则会按需创建一个控制台窗口,该窗口会在不久后自动关闭,即在 PowerShell 由于找不到指定的脚本文件而报告错误后,这一切不可能看到发生了什么。
    解决方法 是使用 -Command 参数,它使窗口无条件地打开:
    // Again, passing arguments individually is an option in .NET Core / .NET 5+
    System.Diagnostics.Process.Start(
    "powershell.exe", // The Windows PowerShell CLI
    @"-ExecutionPolicy Bypass -NoExit -NoLogo -Command & C:\Users\username\Desktop\test.ps1 5"
    ).WaitForExit();
    注意使用 & , call operator , 调用脚本(在这种情况下这不是绝对必要的,但通常是如果脚本文件路径被引用和/或包含变量引用)。
    另请注意,使用 -Command更改传递参数的解释方式 ,这可能会也可能不会导致问题(不是简单的参数,例如 5 );简而言之:在命令行解析之后,在此期间语法(未转义) "字符。被剥离,PowerShell 然后将结果参数解释为 PowerShell 源代码,使它们经受额外的解释层 - 参见 this answer想要查询更多的信息。

    关于c# - 退出代码 0 不显示 c# 中 ps1 文件的结果和传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68590250/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com