批量使用 PowerShell 命令的问题

Dat*_*ler 0 powershell escaping batch-file

我使用 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"""
Run Code Online (Sandbox Code Playgroud)

它在 cmd 中工作正常并加载 ~40 Mb。但在 Batch 中它只加载 9kb(它是 Html)

mkl*_*nt0 6

批处理文件中 - 与交互式 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"
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 为了概念清晰,我明确使用了-c( -Command),即位置隐含的Windows PowerShell CLI ( powershell.exe) 参数(在PowerShell (Core) 7+中,其 CLI 为pwsh,默认值现在为-f( -File))。

  • 此外,通常最好将整个命令行括起来传递给 PowerShell "...",以防止除(例如)之外的cmd.exe元字符引起问题。%&

    • 如果命令行需要使用嵌入 "字符(上面的解决方案通过使用嵌入引用避免了这种情况'...'),最安全的转义方法是使用"^""(sic) with powershell.exe, 和""with pwsh.exe-有关详细信息,请参阅此答案。

[1] 在交互式使用中,%字符在技术上无法转义,但它们会按原样保留,除非它们是引用现有环境变量的 -style 环境变量引用的一部分cmd.exe,例如. 然而,即使在这种情况下,也有一些方法可以从字面上进行处理,正如本答案中所讨论的。这些技术对于从外部(例如从 Node.Js 或 Python)编程方式调用命令行非常重要,因为这种编程调用(也许令人惊讶)使用交互式会话的规则,而不是批处理文件。%OS%%cmd.exe cmd.exe cmd.exe