Исключить неполные файлы в Get-ChildItem

Исключить неполные файлы в Get-ChildItem

Мне нужно получить список файлов из каталога, который не должен включать неполные файлы (т.е. файлы, которые в данный момент скопированы в каталог)

Как заставить Get-ChildItem исключить неполные файлы?

решение1

Вы можете создать «тестовую» функцию, которая попытается получить исключительную блокировку для файла, который вы собираетесь копировать. Если исключительная блокировка будет успешной, это будет означать, что файл еще не копируется. В PowerShell у вас есть доступ к классам библиотеки .Net Framework, которые в данном случае можно найти в библиотеке System.IO. Ниже приведен возможный пример сценария. Скопируйте его в каталог C:\Temp и создайте несколько текстовых файлов. Откройте один или несколько текстовых файлов с помощью Microsoft Word или какой-либо программы, которая будет блокировать файл (Notepad этого не сделает). Вы могли бы ожидать, что вывод будет включать все файлы, которые не были заблокированы.

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"
}

Связанный контент