You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell跨服务器复制文件脚本执行第二台任务时卡住无响应

故障原因

核心问题按出现概率从高到低排列:

  • 管道传参逻辑错误:Select-String返回的是文本匹配结果对象(MatchInfo),不是文件对象,直接传给Copy-Item时,只要同一个日志文件里有N行匹配搜索字符串,就会触发N次重复复制操作。第二台服务器上的目标日志如果正被服务进程锁定写入,重复触发的复制请求会一直等待文件锁释放,进程直接挂死,不会继续向下执行。第一台服务器因为匹配到的文件没有被锁定、或者匹配行数少刚好跑完,所以表现正常。
  • 目录遍历挂起:第二台服务器的\\customer002\e$\Logs路径下如果存在无权限访问的目录、循环软链接/挂载点、损坏的文件系统条目,Get-ChildItem -Recurse遍历到对应位置时会直接卡住,不会自动跳过,也不抛出错误。
  • SMB传输异常:跨UNC路径复制时如果出现网络闪断、目标文件同名占用、共享会话超时,没有超时机制的复制操作会一直处于IO等待状态,进程不会退出。

原脚本全程没有加错误处理参数,碰到上述异常时不会报错也不会跳过,所以会一直卡在第二台的复制阶段,到不了第二条Write-Host语句。

排查步骤
  • 先拆分第二台的执行链路,单独执行目录遍历命令,确认是否卡在遍历阶段:
Get-ChildItem \\customer002\e$\Logs\$Folder -Filter $LogName -Recurse -ErrorAction Stop

如果这步就卡住,说明是目录遍历问题,后续执行时加上-ErrorAction SilentlyContinue跳过不可访问的条目,必要时加-Depth参数限制递归深度,避免循环目录导致的死循环。

  • 如果遍历正常,单独执行匹配命令,确认匹配结果是否正常:
Get-ChildItem \\customer002\e$\Logs\$Folder -Filter $LogName -Recurse -ErrorAction SilentlyContinue | Select-String $SrchString | Select-Object Path -Unique

这步会列出所有包含搜索字符串的日志文件路径,可以确认是否存在异常大的文件、被占用的文件。

  • 手动在资源管理器访问\\customer002\e$\Logs和目标复制路径\\SAMPLE2\c$\users\$UserName\Desktop,确认当前账号有读写权限,SMB连接没有断开。
修复方案

修正管道传参逻辑,对匹配到的文件路径去重,每个文件只复制一次,加上异常捕获,碰到被锁定、无权限的文件直接跳过,不会挂死进程:

$AppType = Read-Host "What App Server do you need calls from? (MCP,RM,SIP,URS,ORS,WFM,WEB,GIR) [can also use * for all servers]"
$LogDate = Read-Host "What date was the call? (yyyymmdd)"
$LogHour = Read-Host "What hour was the call? (hh) [can also use * for entire day]"
$UserName = Read-Host "What is your UserID? (files will be places on Host SAMPLE2\c:\users\*USERID*\Desktop)"
$SrchString = Read-Host "What string are you searching for? (can use connid or ANI for example)"
$LogName = "*"+$LogDate+"_"+$LogHour+"*.log"
$Folder = "*cust"+$AppType+"*"
$destPath = "\\SAMPLE2\c$\users\$UserName\Desktop"

# 复制第一台服务器文件
Get-ChildItem \\customer001\e$\Logs\$Folder -Filter $LogName -Recurse -ErrorAction SilentlyContinue | 
    Select-String $SrchString | 
    Select-Object -ExpandProperty Path -Unique |
    ForEach-Object {
        Copy-Item -Path $_ -Destination $destPath -Force -ErrorAction SilentlyContinue
    }
Write-Host "Finished copying 001 files...."

# 复制第二台服务器文件
Get-ChildItem \\customer002\e$\Logs\$Folder -Filter $LogName -Recurse -ErrorAction SilentlyContinue | 
    Select-String $SrchString | 
    Select-Object -ExpandProperty Path -Unique |
    ForEach-Object {
        try {
            Copy-Item -Path $_ -Destination $destPath -Force -ErrorAction Stop
            Write-Host "Success copied: $_"
        }
        catch {
            Write-Host "Skip inaccessible file: $_ , reason: $($_.Exception.Message)"
        }
    }
Write-Host "Finished copying 002 files...."

内容的提问来源于stack exchange,提问作者BonnieMcD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 23:18:16