Ich benötige eine Dateiliste aus einem Verzeichnis, die keine unvollständigen Dateien enthalten darf (d. h. Dateien, die aktuell in das Verzeichnis kopiert werden).
Wie kann ich erreichen, dass Get-ChildItem unvollständige Dateien ausschließt?
Antwort1
Möglicherweise können Sie eine „Test“-Funktion erstellen, die versucht, eine exklusive Sperre für die Datei zu erhalten, die Sie kopieren möchten. Wenn die exklusive Sperre erfolgreich ist, bedeutet dies, dass die Datei nicht mehr kopiert wird. Innerhalb von PowerShell haben Sie Zugriff auf die .Net Framework-Bibliotheksklassen, die in diesem Fall in der System.IO-Bibliothek zu finden sind. Ein mögliches Beispielskript finden Sie unten. Kopieren Sie es in Ihr Verzeichnis C:\Temp und erstellen Sie einige Textdateien. Öffnen Sie eine oder mehrere der Textdateien mit Microsoft Word oder einem anderen Programm, das die Datei sperrt (Notepad tut dies nicht). Sie würden erwarten, dass die Ausgabe alle Dateien enthält, die nicht gesperrt wurden.
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"
}