返回

如何轻松解决 PowerShell Invoke-WebRequest 中的“Illegal Characters in Path”错误?

windows

如何解决 Invoke-WebRequest 中的“Illegal Characters in Path”错误:一份全面的指南

作为一名程序员,我经常使用 PowerShell 来执行各种任务,包括从 Web 下载文件。然而,我最近遇到了一个令人困惑的错误:“Illegal characters in path”。经过一番调查,我发现了导致此错误的根本原因和解决方法。

错误原因

此错误通常发生在使用 Split-Path 命令从 URL 中提取文件名,然后在 Invoke-WebRequest 命令中指定 -OutFile 参数时。Split-Path 命令将路径或 URI 作为输入,并返回一个包含路径各个组成部分(如文件名)的对象。当使用 Split-Path -Leaf 命令时,它将返回文件的完整名称(包括扩展名)。

Invoke-WebRequest 命令中,Split-Path -Leaf 命令的输出被包裹在引号 (") 中。引号会将输出解释为一个字符串,其中包含文件名和一个尾随空格。当将此字符串传递给 -OutFile 参数时,PowerShell 会将尾随空格解释为路径的一部分,从而导致 “Illegal characters in path” 错误。

解决方案

为了解决此问题,我们需要确保 Split-Path 命令的输出不包含尾随空格。有两种方法可以做到这一点:

  1. 使用 -trim 操作符: -trim 操作符可用于删除字符串末尾的空格。以下命令将修剪 Split-Path -Leaf 命令的输出:
Invoke-WebRequest -OutFile "$(Split-Path -Leaf ${file_url}).trim()" "${file_url}"
  1. 使用 Split-Path -Leaf $file_url: 直接将 Split-Path -Leaf 命令的输出传递给 Invoke-WebRequest 命令的 -OutFile 参数,而无需使用引号,也能确保输出不会包含尾随空格:
Invoke-WebRequest -OutFile $(Split-Path -Leaf $file_url) "${file_url}"

示例

以下是一个完整的示例,说明如何使用 Split-Path 命令从 URL 中提取文件名,并使用 Invoke-WebRequest 命令下载文件:

$file_url = "https://github.com/vsajip/python-gnupg/releases/download/0.5.2/python_gnupg-0.5.2-py2.py3-none-any.whl"
Invoke-WebRequest -OutFile $(Split-Path -Leaf $file_url).trim() "${file_url}"

结论

通过遵循上述解决方案,你可以避免在使用 Invoke-WebRequest 命令时出现 “Illegal characters in path” 错误,并成功下载文件。我希望本文对遇到类似问题的其他程序员有所帮助。

常见问题解答

1. 我在命令中使用 -OutFile (Split-Path -Leaf $file_url).trim() 时仍收到错误。是什么原因造成的?

确保你在将 $file_url 变量的值指定给 $file_url 之前,对它进行了定义和赋值。

2. 我可以将 Split-Path -Leaf 命令的输出直接传递给 Invoke-WebRequest 命令的 -OutFile 参数吗?

是的,你可以直接传递,而无需使用 -trim 操作符或引号。

3. 此解决方案是否适用于从不同网站下载文件?

是的,此解决方案适用于从任何网站下载文件,只要 URL 中包含要下载的文件的完整路径。

4. 还有其他方法可以从 URL 中提取文件名吗?

除了 Split-Path -Leaf 命令之外,还可以使用 [System.IO.Path]::GetFileName() 方法或正则表达式从 URL 中提取文件名。

5. 此错误的原因是否与编码有关?

通常情况下,此错误不是由编码问题引起的。然而,如果你在 URL 或文件名中使用非 ASCII 字符,则可能需要对编码进行一些调整。