PowerShell中如何仅对哈希表匹配数组元素的对象执行ForEach操作
PowerShell 哈希表匹配已停止作业条目的实现方案
你原有逻辑的核心错误是if语句语法不符合PowerShell规范,且没有用正确的数组成员判断方式,直接用内置运算符即可实现需求,不需要复杂的嵌套逻辑。
正确实现代码
写法1:遍历中加条件判断(和你原有框架完全兼容)
# 获取所有状态为Stopped的作业名称数组,可简化为一行写法 $joblist = (Get-Job | Where-Object { $_.State -eq "Stopped" }).Name foreach ($location in $myhashtable.GetEnumerator()) { # 判断当前哈希表条目的Key是否存在于已停止作业列表中 if ($location.Key -in $joblist) { # 执行目标逻辑,需要传参时可直接取$location.Key和$location.Value SomeFunction } }
写法2:先筛选再遍历(逻辑更简洁)
可以先把符合条件的哈希表条目过滤出来,再遍历执行,避免循环里写判断:
$joblist = (Get-Job | Where-Object { $_.State -eq "Stopped" }).Name # 直接过滤出Key对应作业已停止的哈希表条目 $targetEntries = $myhashtable.GetEnumerator() | Where-Object { $_.Key -in $joblist } foreach ($location in $targetEntries) { SomeFunction }
关键注意点
- PowerShell所有流程控制语句(
if/foreach等)的判断条件必须放在成对圆括号()内,执行逻辑块必须放在成对大括号{}内,你最初写的框架存在括号错位、缺括号的语法错误 -in是PowerShell 3.0及以上版本原生支持的数组成员判断运算符,左侧为待匹配值,右侧为数组,匹配成功返回$true;如果使用2.0及更老版本,可替换为反向的-contains判断,写法为if ($joblist -contains $location.Key),效果完全一致- 若出现明明作业存在却匹配不上的情况,优先检查字符串是否存在大小写差异、前后多余空格,可通过统一转小写、调用
Trim()方法处理后再匹配 - 执行
SomeFunction时如果需要用到当前条目的作业配置值,直接通过$location.Value即可获取,和全量遍历的使用方式没有区别
内容的提问来源于stack exchange,提问作者user18982890
相关产品推荐
相关产品推荐

