PowerShell 脚本命令错误,但在 ISE 中有效

PowerShell Script Error in command but works in ISE

我在 ISE 中 运行ning 一个脚本,它主要从 public 站点下载文件:

#This PowerShell code scrapes the site and downloads the latest published file.  
Param( 
    $Url = 'https://randomwebsite.com',
    $DownloadPath = "C:\Downloads", 
    $LocalPath = 'C:\Temp', 
    $RootSite = 'https://publicsite.com', 
    $FileExtension = '.gz' 
)

#Define the session cookie used by the site and automate acceptance.  $session = New-Object Microsoft.PowerShell.Commands.WebRequestSession 
$cookie =  New-Object System.Net.Cookie
$cookie.Name = "name"
$cookie.Value = "True" 
$cookie.Domain = "www.public.com"
$session.Cookies.Add($cookie);

$FileNameDate = Get-Date -Format yyyyMMdd  
$DownloadFileName = $DownloadPath + $FileNameDate + $FileExtension 
$DownloadFileName 

TRY{
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    $WebSite = Invoke-WebRequest $Url -WebSession $session -UseBasicParsing   #this gets the links we need from the main site. 
    $Table  = $WebSite.Links | Where-Object {$_.href -like "*FetchDocument*"} | fl href #filter the results that we need. 
    #Write-Output $Table 
    $FilterTable=($Table | Select-Object -Unique | sort href -Descending) | Out-String

    $TrimString = $FilterTable.Trim() 
    $FinalString = $RootSite + $TrimString.Trim("href :") 
 
    #Write-Verbose $FinalString | Out-String
    #Start-Process powershell.exe -verb RunAs -ArgumentList "-File C:\some\path\base_server_settings.ps1" -Wait
    Invoke-WebRequest $FinalString -OutFile $DownloadFileName -TimeoutSec 600 
        
    $ExpectedFileName = Get-ChildItem | Sort-Object LastAccessTime -Descending | Select-Object -First 1 $DownloadPath.Name | SELECT Name 
    $ExpectedFileName
    Write-Host 'The latest DLA file has been downloaded and saved here:' $DownloadFileName -ForegroundColor Green
}

CATCH{
    [System.Net.WebException],[System.IO.IOException]
    Write "An error occured while downloading the latest file." 
    Write  $_.Exception.Message 
}

预期是它将文件下载到下载文件夹中,实际上在使用 ISE 时确实下载了该文件。

当我尝试将此作为命令 运行 时 (PowerShell.exe -file "/path/script.ps1) 我收到一条错误消息:

下载最新文件时出错。由于对象的当前状态,操作无效。

out-lineoutput : The object of type "Microsoft.PowerShell.Commands.Internal.Format.GroupEndData" is not valid or not in the correct sequence. This is likely caused by a user-specified "format-*" command which is conflicting with the default formatting. At \path\to\file\AutomatedFileDownload.ps1:29 char:9

  •     $FilterTable=($Table | Select-Object -Unique | sort href -Des ...
    
  •     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : InvalidData: (:) [out-lineoutput], InvalidOperationException
    • FullyQualifiedErrorId : ConsoleLineOutputOutOfSequencePacket,Microsoft.PowerShell.Commands.OutLineOutputCommand

我找到了几篇描述使用 MTA 或 STA 开关的文章,并且我尝试将 -MTA 或 -STA 添加到命令中,但它仍然在命令中给出相同的错误。

如评论所述,您正试图从网站上获得一个 link,但将您的指令传送到 Format-ListOut-String 之类的东西,结果要么什么都没有或作为单个多行字符串。.在这两种情况下,这不会让你得到你想要的。

不知道 links 的实际值 当然,我建议你试试这个:

Param( 
    $Url           = 'https://randomwebsite.com',
    $DownloadPath  = "C:\Downloads",
    $LocalPath     = 'C:\Temp',
    $RootSite      = 'https://publicsite.com',
    $FileExtension = '.gz'
)

# test if the download path exists and if not, create it
if (!(Test-Path -Path $DownloadPath -PathType Container)){
    $null = New-Item -Path $DownloadPath -ItemType Directory
}

#Define the session cookie used by the site and automate acceptance.  
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession 
$cookie =  New-Object System.Net.Cookie
$cookie.Name = "name"
$cookie.Value = "True" 
$cookie.Domain = "www.public.com"
$session.Cookies.Add($cookie);

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

try {
    $WebSite = Invoke-WebRequest -Uri $Url -WebSession $session -UseBasicParsing -ErrorAction Stop  #this gets the links we need from the main site. 
    # get the file link
    $lastLink = ($WebSite.Links | Where-Object {$_.href -like "*FetchDocument*"} | Sort-Object href -Descending | Select-Object -First 1).href
    # create the file URL
    $fileUrl = "$RootSite/$lastLink"
    # create the full path and filename for the downloaded file
    $DownloadFileName = Join-Path -Path $DownloadPath -ChildPath ('{0:yyyyMMdd}{1}' -f (Get-Date), $FileExtension)

    Write-Verbose "Downloading $fileUrl as '$DownloadFileName'"
    Invoke-WebRequest -Uri $fileUrl -OutFile $DownloadFileName -TimeoutSec 600 -ErrorAction Stop

    # test if the file is downloaded
    if (Test-Path -Path $DownloadFileName -PathType Leaf) {
        Write-Host "The latest DLA file has been downloaded and saved here: $DownloadFileName" -ForegroundColor Green
    }
    else {
        Write-Warning "File '$DownloadFileName' has NOT been downloaded"
    }
}
catch [System.Net.WebException],[System.IO.IOException]{
    Write-Host "An error occured while downloading the latest file.`r`n$($_.Exception.Message)" -ForegroundColor Red
}
catch {
   Write-Host "An unknown error occured while downloading the latest file.`r`n$($_.Exception.Message)" -ForegroundColor Red
}