PowerShell使用Do Until与Get-SmbOpenFile检测文件占用异常问题
解决PowerShell检测SMB打开文件状态的循环问题
看起来你遇到的核心问题是脚本只在启动时检测了一次打开文件的状态,之后循环里一直沿用最初的检测结果——哪怕后来文件都关闭、会话断开了,变量也没更新,所以才会一直重复显示“Files are opened...”。
我帮你调整下脚本,把检测逻辑放到循环内部,确保每次都能获取实时的文件状态:
Clear-Host Do { # 每次循环都重新拉取当前的SMB打开文件列表 $currentOpenFiles = Get-SmbOpenFile if ($currentOpenFiles) { "$(Get-Date) Files are opened, please wait..." Start-Sleep -Seconds 10 } else { "$(Get-Date) No files are opened" # 无文件打开时直接退出循环 break } } While ($true)
关键改动说明:
- 把
Get-SmbOpenFile移到了Do-While循环内部,确保每次循环都能拿到最新的打开文件状态,而不是启动时的旧数据 - 增加了分支判断:检测到有文件打开时输出提示并等待10秒;无文件时输出提示并终止循环
- 用
$true作为循环持续条件,靠内部的break控制退出,逻辑更直观
如果需要更精准的检测(比如只关注特定共享、特定用户的打开文件),还可以给Get-SmbOpenFile加过滤条件,比如:
$currentOpenFiles = Get-SmbOpenFile | Where-Object { $_.ShareName -eq "YourTargetShare" }
这样修改后,脚本就能实时响应文件状态变化,当所有文件关闭后会自动输出提示并停止运行啦。
内容的提问来源于stack exchange,提问作者conf terminal
相关产品推荐
相关产品推荐

