首页 > 解决方案 > WebClient.UploadFile 在 PowerShell ISE 中有效,但在 PowerShell 控制台窗口中无效

问题描述

我需要将文件上传到 Web 服务器(实际上是 Jira 服务器)。当脚本在 PowerShell ISE 中运行时,以下代码可以完美运行:

$WebClient = new-object System.Net.WebClient
$WebClient.Headers.Add("Authorization", "Basic " + $AuthStr)
$WebClient.Headers.Add("X-Atlassian-Token", "nocheck")
$WebClient.UploadFile($BasePath + "/attachments", $AttachmentFile) >$null

但是,具有相同数据的相同代码在通常的 PowerShell 控制台窗口中执行时会引发错误:

Exception calling "UploadFile" with "2" argument(s): "An exception occurred during a WebClient request."
At C:\Temp\Qualys\ProcessWeeklyReport.ps1:69 char:5
+     $WebClient.UploadFile($BasePath + "/attachments", $AttachmentFile ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WebException

我无法获得更详细的错误消息。未创建任何 PowerShell 配置文件,Powershell 环境处于其默认状态。

用 [system.uri] 类型变量替换纯字符串不会改变这种情况。

这是一个本地问题,而不是 Web 服务器返回的错误。如果抛出错误,数据包嗅探器不会显示与服务器的任何通信。

有人可以建议在哪里挖吗?

标签: powershellwebclient

解决方案


找到了。$AttachmentFile 字符串变量包含文件名。但是,这只是没有任何路径的文件名。该文件位于脚本文件夹中。如果在独立控制台中执行,由于某种原因 UploadFile 方法无法找到此文件。应指定文件的完整路径(包括文件夹路径)以使其正常工作。

上面的代码应该修改为在 ISE 和控制台中都可以工作:

$WebClient = new-object System.Net.WebClient
$WebClient.Headers.Add("Authorization", "Basic " + $AuthStr)
$WebClient.Headers.Add("X-Atlassian-Token", "nocheck")
$WebClient.UploadFile($BasePath + "/attachments", (Get-Location).Path + "\" + $AttachmentFile)

顺便说一句,如果分析 try-catch 块中的 $Error[0] 内容,可以看到此错误(找不到文件)。系统尝试查找此文件的位置是用户配置文件的根目录 (c:\users\username)。如果从命令行显示 $Error[0],则此信息不存在。


推荐阅读