Was ist die richtige Syntax, um den Inhalt eines Ordners auszuschließen, aber nicht den Ordner selbst?

7

Ich habe ein Powershell-Skript, das Dateien von $sourcenach kopiert $destund einige Dateitypen ausschließt. Es schließt meine CSV-Dateien und web.config-Dateien gut aus, aber es schließt den Inhalt des Protokollordners nicht aus. Dies ist mein Skript. Wie lautet die richtige Syntax, um den Inhalt der Dateien auszuschließen, nicht jedoch den LogOrdner selbst?

$exclude = @('Thumbs.db','*-Log.csv','web.config','Logs/*')

Get-ChildItem $source -Recurse -Exclude $exclude | Copy-Item -Destination {Join-Path $dest $_.FullName.Substring($source.length)}
Guanom
quelle

Antworten:

4

Sie müssen ein zweites Array mit den Pfaden einrichten, die Sie vermeiden möchten, und dann einen Filter in die Pipe einfügen. Hier ist ein Beispielcode:

$exclude = @('Thumbs.db','*-Log.csv','web.config','Logs/*')
$directory = @("C:\logs")
Get-ChildItem $source -Recurse -Exclude $exclude | where {$directory -notcontains $_.DirectoryName}
Doltknuckle
quelle
Kopiert das das Verzeichnis, aber nicht die Dateien, oder ignoriert es einfach den gesamten Ordner?
Guanome
Das sollte den Ordner kopieren, aber nicht den Inhalt. Die where-Klausel betrifft nur Dateien. Wenn Sie Ordner einschränken möchten, müssen Sie je nach Situation "$ _. Name" oder "$ _. FullName" verwenden.
Doltknuckle
Für mich macht diese where-Klausel keinen Sinn, aber sie funktioniert!
Guanome
Beachten Sie, dass die where-Klausel where {$directory -notcontains $_.DirectoryName}subtil ist und die Verzeichnisnameneigenschaft des angegebenen Eintrags mit der Liste im Verzeichnis $ übereinstimmt. Dies bedeutet, dass nur exakte Einträge auf diese Weise funktionieren. Wenn ich eine Pfadkomponente (wie bin) ausschließen möchte, gibt es keine Methode dafür, es sei denn, ich liste jeden vollständigen Pfad auf, den ich ausschließen möchte (dh c: \ temp \ bin, c: \ bin, C: \ bin \ temp)
0

Sie können Ihre eigene rekursive Kopierfunktion erstellen.

function Copy-WithFilter ($sourcePath, $destPath)
{
    $exclude = @('Thumbs.db', '*-Log.csv','web.config', 'Logs')

    # Call this function again, using the child folders of the current source folder.
    Get-ChildItem $sourcePath -Exclude $exclude | Where-Object { $_.Length -eq $null } | % { Copy-WithFilter $_.FullName (Join-Path -Path $destPath -ChildPath $_.Name) } 

    # Create the destination directory, if it does not already exist.
    if (!(Test-Path $destPath)) { New-Item -Path $destPath -ItemType Directory | Out-Null }

    # Copy the child files from source to destination.
    Get-ChildItem $sourcePath -Exclude $exclude | Where-Object { $_.Length -ne $null } | Copy-Item -Destination $destPath

}

# $source and $dest defined elsewhere.
Copy-WithFilter $source $dest
Patrick Seymour
quelle