PowerShell 7无法通过Close-SmbOpenFile关闭父文件夹D:\TEST
解决PowerShell无法关闭SMB父文件夹打开记录的问题
我使用PowerShell脚本关闭已打开的网络文件,脚本可正常关闭子文件夹及文件,但无法关闭父文件夹(如D:\TEST)。
我的初始脚本:
Get-SMBOpenFile | where {$_.Path -like "D:\TEST\*" -or $_.Path -like "D:\TEST\"} | Close-SmbOpenFile -Force -Verbose
执行该脚本后,仍能看到父文件夹的打开记录:
FileId SessionId Path ShareRelativePath ClientComputerName ClientUserName ------ --------- ---- ----------------- ------------------ -------------- 618475292929 618475290673 D:\TEST\ 192.168.1.1 CONTOSO\user1
补充测试:执行仅匹配子项的命令Get-SMBOpenFile | where {$_.Path -like "D:\TEST\*"},输出包含父文件夹的打开记录:
FileId SessionId Path ShareRelativePath ClientComputerName ClientUserName ------ --------- ---- ----------------- ------------------ -------------- 619012162101 618475290673 D:\TEST\New folder - Copy New folder - Copy 192.168.1.1 CONTOSO\User 619012162273 618475290673 D:\TEST\ 192.168.1.1 CONTOSO\User 619012162277 618475290673 D:\TEST\New folder - Copy (2) New folder - Copy (2) 192.168.1.1 CONTOSO\User
执行关闭命令后,父文件夹的打开记录依然存在:
Get-SMBOpenFile | where {$_.Path -like "D:\TEST\*"} FileId SessionId Path ShareRelativePath ClientComputerName ClientUserName ------ --------- ---- ----------------- ------------------ -------------- 619012162357 618475290673 D:\TEST\ 192.168.1.1 CONTOSO\User 619012162365 618475290673 D:\TEST\ 192.168.1.1 CONTOSO\User
解决方法
1. 修正Path匹配条件
Get-SMBOpenFile返回的父文件夹路径可能存在两种格式:D:\TEST(无末尾斜杠)和D:\TEST\(有末尾斜杠),原脚本的匹配规则没覆盖无斜杠的情况。修改过滤条件,同时匹配两种格式:
Get-SMBOpenFile | Where-Object { $_.Path -eq "D:\TEST" -or $_.Path -eq "D:\TEST\" -or $_.Path -like "D:\TEST\*" } | Close-SmbOpenFile -Force -Verbose
2. 单独关闭父文件夹的打开记录
如果只需要处理父文件夹的打开记录,可以直接精确匹配路径后关闭:
Get-SMBOpenFile | Where-Object { $_.Path -eq "D:\TEST" -or $_.Path -eq "D:\TEST\" } | Close-SmbOpenFile -Force -Verbose
3. 关闭对应SMB会话彻底断开连接
如果客户端(如打开资源管理器窗口)在关闭文件后立即重新建立连接,导致打开记录反复出现,可以直接关闭对应的SMB会话:
# 获取目标会话ID(去重) $targetSessions = Get-SMBOpenFile | Where-Object { $_.Path -eq "D:\TEST" -or $_.Path -eq "D:\TEST\" -or $_.Path -like "D:\TEST\*" } | Select-Object -Unique SessionId # 关闭会话 $targetSessions | ForEach-Object { Close-SmbSession -SessionId $_.SessionId -Force -Verbose }
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

