PowerShell脚本批量复制指定HotFixID文件异常问题求助
问题分析与解决
核心问题
你的脚本出现“复制所有文件”的问题,根源有两个:
- HotFixID列表存在格式污染:通过
Out-File保存的Get-HotFix输出是表格格式,包含多余的空格、空白行,导致*$hotfix*的匹配逻辑失效,最终误匹配所有文件。 - Copy-Item参数搭配错误:当
-Path使用通配符C:\KBtest\*时,-Include参数会被忽略——因为Path已经匹配了目录下所有文件,Include的过滤规则无法生效。
修复方案
步骤1:获取干净的HotFixID列表
跳过文件读写的中间步骤,直接从Get-HotFix提取纯HotFixID,彻底避免格式问题:
# 直接获取无格式污染的HotFixID数组 $HotfixList = Get-HotFix | Select-Object -ExpandProperty HotFixID
步骤2:修正Copy-Item调用
把匹配逻辑整合到-Path参数中,确保只复制目标文件:
ForEach ($Hotfix in $HotfixList) { # 直接通过Path过滤包含当前KB号的文件 Copy-Item -Path "C:\KBtest\*$Hotfix*" -Destination "C:\KBtarget" -ErrorAction SilentlyContinue }
添加-ErrorAction SilentlyContinue可以避免因找不到对应KB文件而抛出错误。
原脚本的快速修复(保留文件读写场景)
如果必须通过文件保存HotFix列表,需要先清理读取到的内容:
# 创建HotFix列表文件 Get-HotFix | Select-Object HotFixID | Out-File "C:\Scripts\CurrentHotfixList.txt" # 读取并清理内容:跳过前3行+去除空白行+修剪每行空格 $HotfixList = Get-Content "C:\Scripts\CurrentHotfixList.txt" | Select-Object -Skip 3 | Where-Object { $_ -match '\S' } | ForEach-Object { $_.Trim() } # 复制文件(改用Path匹配) ForEach ($Hotfix in $HotfixList) { Copy-Item -Path "C:\KBtest\*$Hotfix*" -Destination "C:\KBtarget" -ErrorAction SilentlyContinue }
内容的提问来源于stack exchange,提问作者Dave_1972
相关产品推荐
相关产品推荐

