请教这段PowerShell链接过滤脚本的详细工作原理
解析这段PowerShell脚本的工作机制
先把脚本贴出来:
$FILE = $GET_HTML.Links | Select-Object @{Label='href';Expression={@{$true=$_.href}[$_.href.EndsWith('win64.exe')]}} | Select-Object -ExpandProperty href
下面拆解每一步的逻辑:
第一步:提取页面所有链接
$GET_HTML.Links这里的$GET_HTML应该是通过Invoke-WebRequest之类的命令获取到的网页对象,.Links属性会把页面里所有<a>标签的链接提取成一个集合。第二步:用哈希表筛选符合条件的链接
这部分是脚本的核心,Select-Object搭配了一个计算属性(哈希表定义):Label='href'指定输出的属性名称为href;Expression里的逻辑分两部分:@{$true=$_.href}创建一个只有一个键值对的哈希表:键是布尔值$true,值是当前链接的具体地址($_.href);[$_.href.EndsWith('win64.exe')]用这个布尔判断结果作为哈希表的索引:如果当前链接以win64.exe结尾,判断结果是$true,哈希表会返回对应的值(也就是这个链接地址);如果判断结果是$false,哈希表里没有$false这个键,就返回$null。
第三步:展开属性并过滤空值
Select-Object -ExpandProperty href会把上一步输出的对象中的href属性展开,同时自动过滤掉值为$null的条目,最终$FILE变量里就只保留了所有以win64.exe结尾的链接地址。
另外补充:这种写法属于技巧性的过滤方式,和更直观的写法效果完全一致,比如等价的可读性更强的写法:
$FILE = $GET_HTML.Links | Where-Object { $_.href.EndsWith('win64.exe') } | Select-Object -ExpandProperty href
内容的提问来源于stack exchange,提问作者Mr. 13
相关产品推荐
相关产品推荐

