WebClient.UploadFile работает в PowerShell ISE, но не в окне консоли PowerShell. - PullRequest
0 голосов
/ 22 октября 2019

Мне нужно загрузить файл на веб-сервер (на самом деле на сервер 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] не меняет ситуацию.

Этолокальная проблема, а не ошибка, возвращаемая веб-сервером. Packet sniffer не показывает никаких сообщений на сервер, если выдается ошибка.

Может кто-нибудь подсказать, куда копать?

1 Ответ

0 голосов
/ 24 октября 2019

Нашел это. Строковая переменная $ 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)

Кстати, эту ошибку (файл не найден) можно увидеть, анализируя содержимое $ Error [0] в блоке try-catch. Место, где система пытается найти этот файл, является корнем профиля пользователя (c: \ users \ username). Эта информация отсутствует, если в командной строке отображается $ Error [0].

...