在Windows共享中使用Powershell和Openfilesclosureslocking的文件

我使用了大量的文件夹共享,但是有一些locking的文件已被其他进程打开。

我需要closures这些文件。 到目前为止,我一直在使用MMC – 系统工具 – 共享文件夹 – 打开文件。

如果我可以使用PowerShell筛选OpenFiles.exe检索的列表/表格,并且一旦获得文件ID用net file / closeclosures它,或者其他一些PS本机意味着类似的效果,那将更方便。

我是PowerShell的新手,所以我想知道是否有办法创build一个PS脚本来接收文件的path,然后使用文件IDclosures该文件?

是否有一个原因,你需要使用openfiles.exe net file
下面是一个只使用net file并将其封装在PowerShell脚本中的函数。

要使用它,您可以复制整个代码,并将其粘贴到PowerShell会话中。 作为一个方面说明,你需要pipe理员权限使用net filenet file

一旦将其粘贴到会话中,您将能够使用Close-OpenFile函数。 用法很简单。 您可以将文件path传送到函数中,也可以将文件path指定为参数。

如果您按原样粘贴,则可以使用Get-Help Close-OpenFile -Example来实际获得帮助以查看示例。 以下是您方便的相同示例。

 # Method 1 : Pipeline @("file\path\1", "file\path\2") | Close-OpenFile "file\path\1" | Close-OpenFile # Method 2 : Parameter Close-OpenFile @("file\path\1", "file\path\2") Close-OpenFile "file\path\2" 

现在,假设您每次打开PowerShell都要使用它。 我已经提供了一个基本的方法来做到这一点(还有其他的方式来做到这一点)在这个答案的结尾。

 <# .Synopsis Closes Files Opened in Network Share .EXAMPLE @("file\path\1", "file\path\2") | Close-OpenFile Attempts to close "file\path\1" and "file\path\2" if they are open. .EXAMPLE Close-OpenFile @("file\path\1", "file\path\2") Attempts to close "file\path\1" and "file\path\2" if they are open. .EXAMPLE "file\path\1" | Close-OpenFile Attempts to close "file\path\1" if it is open. .EXAMPLE Close-OpenFile "file\path\2" Attempts to close "file\path\2" if it is open. #> function Close-OpenFile { [CmdletBinding()] Param ( [Parameter(Mandatory=$true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName=$true, Position=0)] [String[]]$filesToClose ) Begin { $netFile = net file if($netFile.length -lt 7) { Throw "No Files are Open" } $netFile = $netFile[4..($netFile.length-3)] $netFile = $netFile | ForEach-Object { $column = $_ -split "\s+", 4 New-Object -Type PSObject -Property @{ ID = $column[0] FilePath = $column[1] UserName = $column[2] Locks = $column[3] } } $count = 0 } Process { ForEach ($file in $filesToClose) { ForEach ($openFile in $netFile) { if($openFile.FilePath -eq $file) { $count++ net file $openfile.ID /close > $null } } } } End { Write-Output "Closed $count Files" } } 

下面举例说明每次打开PowerShell时都有这个function的基本方法。

  1. 导航到$env:homepath\Documents\WindowsPowerShell (如果没有它,请创build它)。
    这通常parsing为C:\Users\<username>\Documents\WindowsPowerShell
  2. 创build一个名为profile.ps1 (或Microsoft.PowerShell_profile.ps1 )的文件。
  3. 复制并粘贴整个Close-OpenFiles函数并保存。

这是一个使用CMD和OpenFiles.exe的快速和肮脏。 如果需要的话,我相信这可以很快转换成PoSH。 将其保存为CloseFile.cmd并将其放在path中的文件夹中。

  @echo off if "%1" == "" goto SYNTAX if "%2" == "" goto SYNTAX goto RUNIT :SYNTAX echo Use: echo CloseFile.cmd ^<server^> ^<file^> goto :EOF :RUNIT set _server=%1 set _file=%2 openfiles /query /s %_server% /fo csv | findstr /i /c:"%_file%" > _filelist.txt for /f "tokens=1,4 delims=," %%a in (_filelist.txt) do ( openfiles /disconnect /s %_server% /op %%b /id %%a ) if exist _filelist.txt del _filelist.txt 

Get-SmbOpenFileClose-SmbOpenFile将为您完成工作。

login到您的文件服务器,启动PowerShell。 使用Get-SmbOpenFile在文件服务器上显示所有打开的文件。 这些文件将与下列表头一起显示

 FileId SessionId Path ShareRelativePath ClientComputerName ClientUserName 

使用Close-SmbOpenFileclosures文件。

 Close-SmbOpenFile -FileId 4415226383589 

如果您知道Excel文件是问题,则可以缩小search范围,使其扩展名为.XLSX。

 Get-SmbOpenFile | Where-Object -Property sharerelativepath -match ".XLSX" 

在结果中find问题文件后,可以通过fileIDclosures文件。

如果您想closures文件服务器上的所有打开的文件:

 Get-SmbOpenFile | Close-SmbOpenFile 

如果您想closures一个或多个打开的文件,并且文件扩展名为“.XLSX”。

 Get-SmbOpenFile | Where-Object -Property sharerelativepath -match ".XLSX" | Close-SmbOpenFile -Force 

****注意****根据TechNet文章“ Close-SMBOpenFile cmdlet 强制closures由服务器消息块(SMB)服务器的其中一个客户端打开的文件该cmdlet应小心使用如果在closures文件之前客户端没有将所有文件修改刷新回服务器, 可能会导致数据丢失给正在closures文件的客户端。

有关CMDlets的更多信息

Get-SmbOpenFile https://technet.microsoft.com/en-us/library/jj635701(v=wps.620).aspx

closuresSmbOpenFile https://technet.microsoft.com/en-us/library/jj635721(v=wps.620).aspx