使用存储在Powershell数组中的值替换URL的几个部分

时间:2019-02-13 21:47:01

标签: arrays powershell url foreach

我正在尝试使我的过程自动化,该过程涉及获取在上个月的每个月的第一天生成的每月报告。生成这些报告的系统具有不同的分发方式,一些上载到SFTP服务器,一些作为附件通过电子邮件发送,而我当前要获取的那些存储在Web服务器上。

使用我发现的其他代码,我能够通过托管报告之一的URL向Web服务器进行身份验证,并且能够成功下载报告。

代码如下:

$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文件,并且它们都被正确命名(monthlyreport _ $serverName。pdf),但是所有文件的大小均为6KB,它们不能在PDF阅读器中打开它们,因为它们以某种方式损坏了。 6KB与任何报告的文件大小都不匹配,因此肯定弄乱了某些内容。此外,它们不会按照$downloadPath变量移动到自己的文件夹中,而是所有7个文件最终都位于"C:\Users\user\Documents\Reports_January_2019\File Servers\department7\"

任何指导将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

在您的某些命令和变量中似乎存在逻辑上的变量扩展问题。当您在循环外尝试扩展在循环内分配的变量时,您将只对它求值一次,而不是循环的每次迭代。我不知道下面的代码是否可以为您提供所需的结果,但是我知道它可以解决变量扩展问题。

on-premises environment