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

Как я могу получить Get-ChildItem для исключения неполных файлов?

1 ответ1

2

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .