我已验证服务处于stopped status.
中
我还验证了文件E:folderfile.exe
使用以下cmdlets(即returning blank output
(时没有使用任何进程。
$lockedFile='E:folderfile.exe'
Get-Process | foreach{$processVar = $_;$_.Modules | foreach{if($_.FileName -eq $lockedFile){$processVar.Name + " PID:" + $processVar.id}}}
但是,我仍然无法运行以下cmdlet:
copy-item e:newfolderfile.exe e:folder
上述cmdlet正在生成以下错误:
The process cannot access the file 'E:folderfile.exe' because it is being used by another process.
+ CategoryInfo : NotSpecified: (:) [Copy-Item], IOException
+ FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.CopyItemCommand
您正试图将文件从文件夹复制到完全相同的文件夹,但这是行不通的。将其他文件夹定义为目标。
至于关闭文件锁,我不认为Get-Process
是关闭锁定文件句柄所真正需要的。为此,我一直求助于SysInternal的Handle.exe。我甚至写了一个简短的脚本来处理那些锁定了文件的关闭过程:
Function Close-LockedFile{
Param(
[Parameter(Mandatory=$true,ValueFromPipeline=$true)][Object[]]$InputFile
)
Begin{
$HandleApp = 'C:localbinHandle.exe'
If(!(Test-Path $HandleApp)){Write-Host "Handle.exe not found at $HandleApp`nPlease download it from www.sysinternals.com and save it in the afore mentioned location.";break}
}
Process{
$HandleOut = Invoke-Expression ($HandleApp+' '+$InputFile.Fullname)
$Locks = $HandleOut |?{$_ -match "(.+?)s+pid: (d+?)s+type: Files+(w+?): (.+)s*$"}|%{
[PSCustomObject]@{
'AppName' = $Matches[1]
'PID' = $Matches[2]
'FileHandle' = $Matches[3]
'FilePath' = $Matches[4]
}
}
ForEach($Lock in $Locks){
Invoke-Expression ($HandleApp + " -p " + $Lock.PID + " -c " + $Lock.FileHandle + " -y") | Out-Null
}
$InputFile
}
}
如果需要,可以通过管道将文件对象连接到该对象,以关闭整个文件列表上的任何锁。例如:
Get-ChildItem e:newfolder | Close-LockedFile | Copy-Item -Dest e:newdest
这将关闭e:\newfolder文件夹中任何文件的锁,然后将它们复制到e:\newdest文件夹。