我需要从目录中获取文件列表,该目录不能包含不完整的文件(即当前复制到目录中的文件)
我如何让 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"
}