Excluir archivos incompletos en Get-ChildItem

Excluir archivos incompletos en Get-ChildItem

Necesito obtener una lista de archivos de un directorio que no debe incluir archivos incompletos (es decir, archivos E, que actualmente están copiados en el directorio).

¿Cómo puedo hacer que Get-ChildItem excluya archivos incompletos?

Respuesta1

Es posible que pueda crear una función de "prueba" que intente obtener un bloqueo exclusivo del archivo que desea copiar. Si el bloqueo exclusivo tiene éxito, eso implicaría que el archivo aún no se estaba copiando. Dentro de PowerShell tienes acceso a las clases de la biblioteca .Net Framework, que en este caso se pueden encontrar en la biblioteca System.IO. A continuación se muestra un posible script de muestra. Cópielo a su directorio C:\Temp y cree algunos archivos de texto. Abra uno o más archivos de texto con Microsoft Word o algún programa que bloquee el archivo (el Bloc de notas no lo hará). Es de esperar que el resultado sean todos los archivos que no estaban 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"
}

información relacionada