批量使用 PowerShell 命令的问题

Issue with using PowerShell command in batch

我使用 PowerShell 命令从我的云中下载了一个 zip 文件。 该命令在 PowerShell 和命令行中正常工作。但是,如果我将命令行中的命令插入批处理脚本,则只会下载 html。 为什么该命令在命令行中可以正常工作,但在批处理文件中却不能? 我没有想法 :D

powershell Invoke-WebRequest """https://sync.luckycloud.de/d/fb56e4a8239a4c6cac7a/files/?p=%2FValheimServer%20Buddelkiste%20Modpack%20v3.4%20-%20Standart.zip&dl=1""" -OutFile """C:\Users\Anonymos\Downloads\servermodpack.zip"""

它在 cmd 中运行良好并加载了 ~40 Mb。但在 Batch 中它只加载 9kb(它是 Html)

批处理文件中 - 相对于 interactive cmd.exe命令提示符[1] - 你需要转义 % 个字符。作为 %% 以便按字面意思传递它们 :

powershell -c "Invoke-WebRequest 'https://sync.luckycloud.de/d/fb56e4a8239a4c6cac7a/files/?p=%%2FValheimServer%%20Buddelkiste%%20Modpack%%20v3.4%%20-%%20Standart.zip&dl=1' -OutFile C:\Users\Anonymos\Downloads\servermodpack.zip"

注:

  • 我用过-c-Command),位置隐含Windows PowerShell CLI(powershell.exe) parameter explicitly for conceptual clarity (in PowerShell (Core) 7+, whose CLI is pwsh,现在默认为 -f-File))。

  • 此外,在 "..." 中包含 整个命令行 以传递给 PowerShell 通常是可取的,以防止 cmd.exe 元字符其他 而不是 %(例如 &)引起的问题。

    • 如果命令行需要使用 embedded " 字符(上面的解决方案通过使用嵌入式 '...' 引号避免了这种情况),最安全的方法要逃避它们,请将 "^""(原文如此)与 powershell.exe 一起使用,将 ""pwsh.exe 一起使用 - 请参阅 了解详细信息。

[1] 在交互式使用中,% 个字符在技术上不能 转义 ,但它们会被保留 as-is 除非它们是 cmd.exe 风格的 environment-variable 引用 的一部分,引用 现有 环境变量,例如 %OS%。然而,即使在这种情况下,也有一些方法可以按字面意思对待 %,如 中所讨论的那样。这些技术对于从外部 cmd.exe以编程方式调用cmd.exe命令行非常重要,例如从Node.Js或 Python,因为此类编程调用 - 可能令人惊讶 - 使用 interactive cmd.exe 会话的规则,而不是批处理文件。