无法使用 ProcessStartInfo 参数将“”传递给 powershell,C#

Can't pass through "" to powershell using ProcessStartInfo arguments, C#

我无法将参数传递给包含 "" 的 powershell。当我使用等效代码但将应用程序更改为 cmd 时,"" 能够通过。

我希望 powershell 执行的参数是:

Copy-Item -Path "{Working Directory}\W11F-assets\" -Destination "C:\Windows\W11F-assets" -Recurse

这是调用该函数的代码:

    ProcessStartInfo movefile = new ProcessStartInfo("powershell.exe");
    string flocation = Directory.GetCurrentDirectory();
    movefile.UseShellExecute = true;
    movefile.Arguments = "Copy-Item -Path \"" + flocation + "\W11F-assets\" -Destination \"C:\Windows\W11F-assets\" -Recurse";
    Process.Start(movefile);

能够通过将 \" 替换为 ' 来解决问题。

当命令传递给 PowerShell CLI 的(隐含位置)-Command (-c) 参数时,任何 未转义 " 字符。在 command-line 处理期间被 剥离 ,并且只有 然后 是参数(space-joined 形成单个字符串,如果有是多个)解释为 PowerShell 代码。

因此:

  • " 作为命令一部分保留的字符必须 \"-转义。

  • 此外,为了防止可能不需要的空白规范化(将多个相邻空格折叠成一个),最好将命令包含在未转义的嵌入式 "..." 中。

为了完整地说明一个应该有效的解决方案,明确使用 -Command-NoProfile 以避免通常不必要地加载配置文件,并使用额外的空间来使概念清晰,采取内插 ($) 逐字 (@) 字符串的优点(其中 \ 可以使用 as-is 和 " 必须转义为 ""):

movefile.Arguments = 
  $@"-NoProfile -Command "" Copy-Item -Path \""{flocation}\W11F-assets\"" -Destination \""C:\Windows\W11F-assets\"" -Recurse "" ";