如何为PowerShell Switch语句添加扩展名与文件名双重条件
解决PowerShell Switch语句多条件匹配问题
需求:当处理的文件为**xyz.txt**(扩展名.txt且文件名完全匹配)时,执行带/un参数的LGPO命令;其他.txt文件执行带/t参数的命令。原代码中重复的.txt分支会导致逻辑冲突,以下是修正后的实现:
修改后的完整代码
function Import-GpoSettings{ <# .SYNOPSIS 导入组策略文件。 .DESCRIPTION 应用DISA/ESS特定组策略。 .PARAMETER Resource 查找pol文件的资源路径。 .PARAMETER MatchString 查找文件名包含该字符串的pol文件。 #> Param ( [string] $Resource, [string] $MatchString ) $policies = Get-ChildItem (Get-ResourcePath $Resource) | Where-Object Extension -in '.txt', '.inf', '.csv' | Where-Object Name -match $matchString ForEach ($policy in $policies) { [string] $currentPolicy = $policy.BaseName Write-HostAndLog "`t 应用标准 $currentPolicy 策略设置。`n" # 切换为匹配文件对象,支持多条件判断 switch ($policy) { # 匹配文件名精确为xyz.txt的情况 {$_.Name -eq 'xyz.txt'} { Invoke-CommandAndLog @((Get-ResourcePath "UtilityModules\LGPO.exe"), " /un", $policy.FullName, " /q") break # 匹配后跳出,避免触发后续txt分支 } # 匹配其他.txt扩展名的文件 {$_.Extension -eq '.txt'} { Invoke-CommandAndLog @((Get-ResourcePath "UtilityModules\LGPO.exe"), " /t", $policy.FullName, " /q") break } '.inf' { Invoke-CommandAndLog @((Get-ResourcePath "UtilityModules\LGPO.exe"), " /s", $policy.FullName, " /q") break } '.csv' { Invoke-CommandAndLog @((Get-resourcepath "UtilityModules\LGPO.exe"), " /a", $policy.FullName, " /q") break } Default { } } } }#endFunction
关键修改说明
- 将Switch的匹配目标从
$policy.Extension改为文件对象$policy,允许使用脚本块作为匹配条件,实现多维度判断 - 新增文件名精确匹配分支
{$_.Name -eq 'xyz.txt'},优先匹配特定文件,执行/un命令后用break跳出,避免触发后续的.txt分支 - 针对
.txt文件调整为脚本块条件,确保仅匹配非xyz.txt的其他文本文件 - 每个分支添加
break,避免Switch继续匹配后续条件,符合单一匹配逻辑
内容的提问来源于stack exchange,提问作者SenseiGrabow
相关产品推荐
相关产品推荐

