Frage

Ich habe ein Skript geschrieben, das für die Archivierung von Protokolldateien von einem Server verwendet wird. Ich bin in ziemlich guter Form mit allem außer der Rekursivität oder nicht von Get-Childitem...

Das Problem, das ich scheine, ist, dass, wenn Get-Childitem nicht rekursiv ist und -Include ist mit nur einem Filter vorhanden, es wird ignoriert! Oder ich mache etwas falsch (wahrscheinlich).

Ich habe die Ausgabe ein wenig aufgeräumt ...

PS C:\foo> Get-childitem -path "c:\foo"

Name
----
bar1.doc
bar2.doc
bar3.doc
foo1.txt
foo2.txt
foo3.txt

PS C:\foo> Get-childitem -path "c:\foo" -Include *.txt
PS C:\foo> Get-childitem -path "c:\foo" -Include *.txt -recurse

Name
----
foo1.txt
foo2.txt
foo3.txt

Sooo??? Ich hatte eine Fantasie, in der ich nur auf einen Weg des Drehbuchs verzweigt hatte, der nicht den Recurse Switch hatte. (Ist es übrigens möglich, Parameter unterschiedlich anzuwenden, um doppelte Codepfade zu vermeiden, bei denen die einzige Variabilität die Parameter für ein CMDLet sind?)

Wie auch immer, hier ist mein Skript für Vollständigkeit, zusätzlich zu meinem Problem mit Get-childitem.

function MoveFiles()
{
    Get-ChildItem -Path $source -Recurse -Include $ext | where { $_.LastWriteTime -lt (Get-Date).AddDays(-$days) } | foreach {
        $SourceDirectory = $_.DirectoryName;
        $SourceFile = $_.FullName;
        $DestinationDirectory = $SourceDirectory -replace [regex]::Escape($source), $dest;
        $DestionationFile = $SourceFile -replace [regex]::Escape($source), $dest;

        if ($WhatIf){
            #Write-Host $SourceDirectory;
            #Write-Host $DestinationDirectory;
            Write-Host $SourceFile -NoNewline
            Write-Host " moved to " -NoNewline
            Write-Host $DestionationFile;
        }
        else{
            if ($DestinationDirectory)
            {
                if ( -not [System.IO.Directory]::Exists($DestinationDirectory)) {
                    [void](New-Item $DestinationDirectory -ItemType directory -Force);
                }
                Move-Item -Path $SourceFile -Destination $DestionationFile -Force;
            }
        }
    }
}
War es hilfreich?

Lösung

Die Antwort ist in der vollständigen Beschreibung des Befehls (Get-Help Get-Childitem -full):

Der Einfügungsparameter wirkt nur dann wirksam, wenn der Befehl den Recurse -Parameter enthält oder der Pfad zum Inhalt eines Verzeichnisses führt, z.

Das Folgende würde also ohne Wiederholung funktionieren.

PS C:\foo> Get-childitem -path "c:\foo\*" -Include *.txt

Andere Tipps

Dies ist ein Verhalten erwartet, aber zugegebenermaßen verwirrend. Aus der Get-Childitem-Hilfedatei:

-Include <string[]>

Ruft nur die angegebenen Elemente ab. Der Wert dieses Parameters qualifiziert den Pfadparameter. Geben Sie ein Pfadelement oder ein Pfadelement oder ein "*.txt" ein. Wildcards sind erlaubt.

Der Einfügungsparameter wirkt nur, wenn der Befehl den Parameter wieder aufnehmen oder der Pfad zum Inhalt eines Verzeichnisses wie C: Windows*führt, wobei das Wildcard -Zeichen den Inhalt des Verzeichnisses von C: Windows angibt.

ps> hilf dir -full | mehr

Hoffe das hilft,

-Oisin

Ich kann Ihnen nicht genau sagen, warum (aber ich werde weiter suchen), aber das Verhalten ist in der Get-Help für Get-Childitem dokumentiert:

-Include <string[]>
    Retrieves only the specified items. The value of this parameter qualifies the Path parameter. Enter a path elem
    ent or pattern, such as "*.txt". Wildcards are permitted.

    The Include parameter is effective only when the command includes the Recurse parameter or the path leads to th
    e contents of a directory, such as C:\Windows\*, where the wildcard character specifies the contents of the C:\
    Windows directory.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top