Powershell Foreach 不跳过数组中的值
Powershell Foreach not skipping values from array
我正在尝试编写一个脚本来下载网站信息。我可以下载信息,但我似乎无法进行过滤。我有一系列要跳过的值存储在 $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
您不能有意义地将数组用作 -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
语句作为表达式,returns 循环体的输出作为数组。
[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
才能继续下一个输入。
我正在尝试编写一个脚本来下载网站信息。我可以下载信息,但我似乎无法进行过滤。我有一系列要跳过的值存储在 $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
您不能有意义地将数组用作 -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
语句作为表达式,returns 循环体的输出作为数组。[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
才能继续下一个输入。