Powershell Foreach不会从数组中跳过值

时间:2019-04-06 14:30:30

标签: powershell foreach skip

我正在尝试编写一个脚本来下载网站信息。我可以下载信息,但似乎无法使过滤工作。我有一系列要跳过的值,它们存储在.matches(s -> OPTIONS.stream().anyMatch(option -> s.contains(option))); 中,但是不能识别if $TakeOut中的值。我必须为每个值写一行。

我想知道的是,如果有一种方法可以使用-eq $TakeOut,因为随着时间的流逝,会有大量的值要跳过。

这行得通,但从长远来看并不实际。

$value

像这样的事情会更好。

if ($R.innerText -eq "Home") {Continue}

这是我的代码示例。

if ($R.innerText -eq $TakeOut) {Continue}

1 个答案:

答案 0 :(得分:1)

您无法有意义地将数组用作-eq操作的RHS(该数组将隐式字符串化,无法按预期工作)。

PowerShell具有运算符-contains-in以测试数组中值的成员资格(按每个元素使用-eq-请参见{{ 3}}作为背景);因此:

 if ($R.innerText -in $TakeOut) {Continue}

通常,可以简化代码(PSv3 +语法):

$TakeOut = 
    "Help",
    "Home",
    "News",
    "Sports",
    "Terms of use",
    "Travel",
    "Video",
    "Weather"

#Retrieve website information
$Results = (Invoke-WebRequest -Uri "https://www.msn.com/en-ca/").Links

#Filter and format to new table of values
$objects = foreach($R in $Results) {
   if ($R.innerText -in $TakeOut) {Continue}
   [pscustomobject @{
      InnerText = $R.InnerText
      href = $R.href
      Title = $R.href.split('/')[4]
   }
}

#output to file
$objects | ConvertTo-HTML -As Table -Fragment >> $list_F
  • 请注意,缺少@(...),这对于数组文字来说从来不需要。

  • 使用+=在循环中构建数组很慢(而且很冗长);只需使用foreach语句作为表达式,即可将循环体的输出作为数组返回。

  • [pscustomobject] @{ ... }是用于构建自定义对象的PSv3 +语法糖;除了比New-Object调用快之外,它还具有保留属性顺序的优点。

您可以将整个内容编写为一个管道:

#Retrieve website information
(Invoke-WebRequest -Uri "https://www.msn.com/en-ca/").Links | ForEach-Object {
   #Filter and format to new table of values
   if ($_.innerText -in $TakeOut) {return}
   [pscustomobject @{
      InnerText = $_.InnerText
      href = $_.href
      Title = $_.href.split('/')[4]
   }
} | ConvertTo-HTML -As Table -Fragment >> $list_F

请注意,需要使用return而不是continue来进行下一个输入。