Powershell Foreach不会从数组中跳过值

问题描述 投票:1回答:1

我正在尝试编写一个下载网站信息的脚本。我能够下载信息,但我似乎无法使过滤工作。我有一系列我希望跳过存储在$TakeOut中的值,但它不识别if -eq $TakeOut中的值。我必须为每个值写一行。

我想知道的是,如果有一种方法可以使用$value随着时间的推移会有相当多的值要跳过。

这有效,但从长远来看并不实用。

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

这样的事情会更好。

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

这是我的代码示例。

#List of values to skip
$TakeOut = @()
$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 -eq $TakeOut) {Continue}
   $objects += New-Object -Type PSObject -Prop @{'InnerText'= $R.InnerText;'href'=$R.href;'Title'=$R.href.split('/')[4]}
}

#output to file
$objects  | ConvertTo-HTML -As Table -Fragment | Out-String >> $list_F
powershell foreach skip
1个回答
1
投票

你不能有意义地使用数组作为-eq操作的RHS(数组将被隐式字符串化,这将无法按预期工作)。

PowerShell有运算符-contains-in来测试数组中值的成员资格(在每个元素的基础上使用-eq - 请参阅this answer的背景信息);因此:

 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继续下一个输入。

© www.soinside.com 2019 - 2024. All rights reserved.