Замените несколько частей URL-адреса, используя значения, хранящиеся в массиве в Powershell - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь автоматизировать мой процесс, который включает в себя выборку ежемесячных отчетов, которые генерируются первого числа каждого месяца за предыдущий месяц.Системы, которые генерируют эти отчеты, имеют различные способы их распространения, некоторые загружаются на SFTP-сервер, некоторые отправляются по электронной почте в виде вложений, а те, которые я сейчас пытаюсь получить, хранятся на веб-сервере.

Используя какой-то другой код, который я обнаружил, я смог пройти аутентификацию на веб-сервере по URL-адресу, на котором размещен один из отчетов, и я могу успешно загрузить отчет.

Вот код:

$request = Invoke-WebRequest $url -SessionVariable fb
$form = $request.Forms[0]
$form.Fields["username"] = "username"
$form.Fields["password"] = "password"
$downloadPath = "C:\Users\user\Documents\Reports_January_2019\File Servers\department1\"
$reportDate = (Get-Date -UFormat %b) + "01" + (Get-Date -UFormat %Y)
$url = "https://ourwebsite.com/schedule-reports/reportname/" + $reportDate + "/12-33-0-PM/servername1/monthlyreport.pdf"

Invoke-WebRequest -Uri ($url + $form.Action) -WebSession $fb -Method POST -Body $form.Fields
Invoke-WebRequest -Uri $url -OutFile ($downloadPath + "monthlyreport_servername1.pdf")

Этот код работает, поэтому я могу скачать .pdf в указанном месте.Есть несколько других серверов, на которых выполняется отчет, поэтому я пытаюсь найти эффективный способ загрузки отчетов, созданных для других серверов.Для этого определенные части URL изменяются.Части, которые изменяются, - это дата, имя сервера и имя отчета, в котором также есть имя сервера.Переменная $reportDate отображает динамическую часть URL-адреса для даты, когда отчет был сгенерирован правильно.

Я попытался изменить этот код и выполнить два цикла foreach, но это то, где я запутался.Вот код, который я пытаюсь заставить загружать все 7 отчетов, используя массив, содержащий имена серверов:

$request = Invoke-WebRequest $url -SessionVariable fb
$form = $request.Forms[0]
$form.Fields["username"] = "username"
$form.Fields["password"] = "password"
$downloadPath = "C:\Users\user\Documents\Reports_January_2019\File Servers\$server\"
$servers = @("department1", "department2", "department3", "department4", "department5", "department6", "department7")
$serverNames = @("server1", "server2", "server3", "server4", "server5", "server6", "server7")
$reportDate = (Get-Date -UFormat %b) + "01" + (Get-Date -UFormat %Y)
$url = "https://ourwebsite.com/schedule-reports/reportname/" + "$reportDate" + "/12-33-0-PM/" + "$serverName" + "/monthlyreport.pdf"

foreach ($serverName in $serverNames) {
    Invoke-WebRequest -Uri ($url + $form.Action) -WebSession $fb -Method POST -Body $form.Fields
    foreach ($server in $servers) {
        Invoke-WebRequest -Uri $url -OutFile ($downloadPath + "monthlyreport_$serverName.pdf")
    }
}

В результате, когда я запускаю это, я получаю 7 .pdf файлов, и онивсе названы соответствующим образом (monthreport_ $serverName .pdf), но размер файла для всех них составляет 6 КБ, и их нельзя открыть в программе чтения PDF, поскольку они каким-то образом повреждены.6 КБ не соответствует размеру файла любого из отчетов, поэтому что-то определенно испорчено.Кроме того, они не перемещаются в свою собственную папку согласно переменной $downloadPath, а вместо этого все 7 файлов заканчиваются на "C:\Users\user\Documents\Reports_January_2019\File Servers\department7\"

. Любое руководство будет с благодарностью!Спасибо!

1 Ответ

0 голосов
/ 14 февраля 2019

Кажется, есть логические проблемы расширения переменных в некоторых ваших командах и переменных.Когда вы находитесь за пределами цикла, пытаясь раскрыть переменную, которая назначена внутри цикла, вы будете оценивать ее только один раз вместо каждой итерации цикла.Я не знаю, даст ли приведенный ниже код результат, который вы ищете, но я знаю, что это решает проблему расширения переменных.

$servers = @("department1", "department2", "department3", "department4", "department5", "department6", "department7")
$serverNames = @("server1", "server2", "server3", "server4", "server5", "server6", "server7")
$reportDate = (Get-Date -UFormat %b) + "01" + (Get-Date -UFormat %Y)

foreach ($serverName in $serverNames) {

    $url = "https://ourwebsite.com/schedule-reports/reportname/" + $reportDate + "/12-33-0-PM/" + $serverName + "/monthlyreport.pdf"
    $request = Invoke-WebRequest $url -SessionVariable fb
    $form = $request.Forms[0]
    $form.Fields["username"] = "username"
    $form.Fields["password"] = "password"

    Invoke-WebRequest -Uri ($url + $form.Action) -WebSession $fb -Method POST -Body $form.Fields

    foreach ($server in $servers) {

        $downloadPath = "C:\Users\user\Documents\Reports_January_2019\File Servers\" + $server + "\"
        Invoke-WebRequest -Uri $url -OutFile ($downloadPath + "monthlyreport_" + $serverName + ".pdf")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...