在 Get-ChildItem 中排除不完整的文件

在 Get-ChildItem 中排除不完整的文件

我需要从目录中获取文件列表,该目录不能包含不完整的文件(即当前复制到目录中的文件)

我如何让 Get-ChildItem 排除不完整的文件?

答案1

您可能能够创建一个“测试”函数,尝试获取您要复制的文件的独占锁。如果独占锁成功,则意味着该文件尚未被复制。在 PowerShell 中,您可以访问 .Net Framework 库类,在本例中可以在 System.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"
}

相关内容