服务已停止但仍无法 运行 复制项目
service is stopped but still not able to run copy-item
我已验证该服务在 stopped status.
我还使用以下 cmdlet 验证了文件 E:\folder\file.exe
没有进程正在使用 returning blank output
。
$lockedFile='E:\folder\file.exe'
Get-Process | foreach{$processVar = $_;$_.Modules | foreach{if($_.FileName -eq $lockedFile){$processVar.Name + " PID:" + $processVar.id}}}
但是,我仍然无法 运行 以下 cmdlet:
copy-item e:\newfolder\file.exe e:\folder
以上 cmdlet 生成以下错误:
The process cannot access the file 'E:\folder\file.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:\localbin\Handle.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: File\s+(\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 文件夹。
我已验证该服务在 stopped status.
我还使用以下 cmdlet 验证了文件 E:\folder\file.exe
没有进程正在使用 returning blank output
。
$lockedFile='E:\folder\file.exe'
Get-Process | foreach{$processVar = $_;$_.Modules | foreach{if($_.FileName -eq $lockedFile){$processVar.Name + " PID:" + $processVar.id}}}
但是,我仍然无法 运行 以下 cmdlet:
copy-item e:\newfolder\file.exe e:\folder
以上 cmdlet 生成以下错误:
The process cannot access the file 'E:\folder\file.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:\localbin\Handle.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: File\s+(\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 文件夹。