PowerShell中IF语句无法正确识别字符串是否包含数组内元素
问题分析与解决方案
核心问题
你的判断逻辑存在两个关键错误:
- 使用
Get-Content读取CSV时,处理的是原始文本行(带引号的字符串),而非结构化的对象属性,导致匹配逻辑失效。 - 直接用
-like/-contains和数组对比的语法错误:-like需要通配符(*)才能匹配子字符串,且与数组结合时的逻辑不符合你的需求;-contains是检查数组是否包含某个值,而非字符串是否包含数组中的元素。
最优解决方案:导出前直接过滤
不需要先导出CSV再事后处理,直接在Get-ChildItem阶段就排除目标目录,更高效且避免后续麻烦:
$Path = "C:\Users\" $RequiredAccounts = @("Public", "defaultuser0") $oneYearAgo = (Get-Date).AddMonths(-12) # 遍历目录,过滤出超过12个月未更新且不属于排除列表的文件夹 Get-ChildItem -Path $Path -Recurse -Directory | Where-Object { $_.LastWriteTime -lt $oneYearAgo -and # 检查路径是否不包含任何排除账户名(用[regex]::Escape避免特殊字符干扰) -not ($RequiredAccounts | Where-Object { $_.FullName -match [regex]::Escape($_) }) } | Select-Object FullName, LastWriteTime | Export-Csv C:\Oldfiles.csv -NoTypeInformation
修正已导出CSV的处理脚本
如果必须处理已生成的CSV文件,改用Import-Csv读取结构化对象,直接访问FullName属性进行判断:
$RequiredAccounts = @("Public", "defaultuser0") Import-Csv "C:\Oldfiles.csv" | ForEach-Object { $fullPath = $_.FullName # 判断路径是否包含任意排除账户 $isExcluded = $RequiredAccounts | Where-Object { $fullPath -match [regex]::Escape($_) } if ($isExcluded) { Write-Output "匹配排除项: $fullPath" } else { Write-Output "未匹配排除项: $fullPath" } }
对之前错误逻辑的说明
- 你用
Get-Content读取的行是类似"C:\Users\Public\Videos","2023-01-01..."的带引号文本,直接和"Public"对比自然不匹配; - 若要用
-like匹配子字符串,需要加通配符,比如$_.ToString() -like "*$($RequiredAccounts[0])*",但这种写法只能单个检查,无法批量处理数组; -contains的正确用法是$RequiredAccounts -contains "Public",用来检查数组是否包含某个值,不适合你的字符串包含场景。
内容的提问来源于stack exchange,提问作者Thomton
相关产品推荐
相关产品推荐

