foreach错误,它无法索引到空数组

时间:2014-01-24 19:18:06

标签: powershell powershell-v2.0

回答here。我正在做以下事情:

param(
    # Required. Download source location (website).
     [Parameter(Mandatory=$True)]
     [URI] $URL
)
process
{
     $wc = New-Object System.Net.WebClient;
     $fileItems = $wc.downloadstring($URL) -split "<a\s+" | %{ [void]($_ -match "^HREF=[`'`"]  ([^`'`">\s]*)"); $matches[1] };
     return $fileItems;
}

我收到以下错误:

ForEach-Object : Cannot index into a null array.
At J:\LMIData\PowerShell\HTTP_based_downloader.ps1:9 char:61
+     $fileItems = $wc.downloadstring($URL) -split "<a\s+" | % <<<< { [void]($_ -match "^HREF=[`'`"]([^`'`">\s]*)"); $matches[1]; };
    + CategoryInfo          : InvalidOperation: (1:Int32) [ForEach-Object], RuntimeException
    + FullyQualifiedErrorId : NullArray,Microsoft.PowerShell.Commands.ForEachObjectCommand

“char:61”位置就在%之后。

现在,有趣的是此代码以前有效。这可能是-match正则表达式中的一个问题吗?我没有声明$matches数组 - 可能就是这样吗?

我在这里不知所措,因为我仍然是PowerShell的新手。我知道我可以使用Invoke-WebRequest获取powershell v3 +中的链接列表,但这不是一个选项,因为正在运行的系统暂时被锁定在v2。

1 个答案:

答案 0 :(得分:2)

看起来更像是您的下载可能不是您所期望的。 尝试添加一些调试。

param(
    # Required. Download source location (website).
     [Parameter(Mandatory=$True)]
     [URI] $URL
  )
  process
  {
     $wc = New-Object System.Net.WebClient;
     $Download = $wc.downloadstring($URL)
     Write-Debug "Download is $Download"
     $fileItems = $Download -split "<a\s+" | %{ [void]($_ -match "^HREF=[`'`"]  ([^`'`">\s]*)"); $matches[1] };
     return $fileItems;
  }

并将$ DebugPreference设置为'Continue'amd,看看你的d / l有效负载是什么样的。