Exclua arquivos incompletos em Get-ChildItem

Exclua arquivos incompletos em Get-ChildItem

Preciso obter uma listagem de arquivos de um diretório que não deve incluir arquivos incompletos (ou seja, arquivos que estão atualmente copiados para o diretório)

Como posso fazer com que Get-ChildItem exclua arquivos incompletos?

Responder1

Você pode criar uma função de "teste" que tenta obter um bloqueio exclusivo para o arquivo que você pretende copiar. Se o bloqueio exclusivo for bem-sucedido, isso significaria que o arquivo ainda não estava sendo copiado. Dentro do PowerShell você tem acesso às classes da biblioteca .Net Framework, que neste caso podem ser encontradas na biblioteca System.IO. Um possível exemplo de script está abaixo. Copie-o para o diretório C:Temp e crie alguns arquivos de texto. Abra um ou mais arquivos de texto com o Microsoft Word ou algum programa que irá bloquear o arquivo (o Bloco de Notas não). Você esperaria que a saída fosse todos os arquivos que não estavam bloqueados.

function Test-UnLockedFile
{
    param([string] $fileNameAndPath)

    try
    {
        Write-Host "Test-LockedFile called with $fileNameAndPath"

        $fileInfo = New-Object ('System.IO.FileInfo') "$fileNameAndPath"

        $fileStream = $fileInfo.Open([System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)

        $fileStream.Close()

        Write-Host "Test-LockedFile found an unlocked file (i.e. `$true)"

        $true        
    }
    catch
    {
        Write-Host "Test-LockedFile found a locked file (i.e. `$false)"
        $false
    }
}


$files = Get-ChildItem -Path "C:\Temp\" -Exclude *.ps1

$unlockedFiles = $files | Where-Object { Test-UnLockedFile $_.FullName }

foreach ($file in $unlockedFiles)
{
    $name = $file.FullName
    Write-Host "Found unlocked file at $name"
}

informação relacionada