服务已停止但仍无法 运行 复制项目

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 文件夹。