Question

J'ai écrit un script qui sera utilisé pour les fichiers journaux d'archivage à partir d'un serveur. Je suis en assez bonne forme avec tout, mais la récursivité ou non de Get-ChildItem ...

La question me semble être avoir que lorsque Get-ChildItem n'est pas récursive et -Include est présent avec un seul filtre, il est ignoré! Ou bien, je fais quelque chose de mal (probablement).

Je l'ai nettoyé la sortie un peu ...

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 ??? J'ai eu un fantasme où tout ce que je devais faire était la branche à un chemin du script qui n'a pas eu l'interrupteur de récursion. (Soit dit en passant, est-il possible d'appliquer des paramètres variablement de manière à éviter les chemins de code dupliqués où la seule variabilité des paramètres est à une applet de commande?)

Quoi qu'il en soit, voici mon script pour être complet, en plus de mon problème avec 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;
            }
        }
    }
}
Était-ce utile?

La solution

La réponse est dans la description complète de la commande (get-help get-childitem -full):

  

Le paramètre Include est efficace   uniquement lorsque la commande inclut la   Recurse paramètre ou le chemin mène à   le contenu d'un répertoire, tels que   C: \ Windows \ *, où le caractère générique   caractère précise le contenu de   C:. répertoire \ Windows

Alors ce qui suit fonctionnerait sans récursion.

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

Autres conseils

Ce comportement est normal, mais il est vrai prêter à confusion. A partir du fichier d'aide Get-ChildItem:

-Include <string[]>

Récupère uniquement les éléments spécifiés. La valeur de ce paramètre qualifie le paramètre Path. Entrez un élément de chemin ou d'un motif, tel que « * .txt ». Les caractères génériques sont autorisés.

Le paramètre Include est efficace uniquement lorsque la commande inclut le paramètre Recurse ou le chemin mène au contenu d'un répertoire, comme C: \ Windows *, où le caractère générique indique le contenu du répertoire C: \ Windows.

ps> aider dir -full | plus

Hope this helps,

-Oisin

Je ne peux pas vous dire exactement pourquoi de celui-ci (mais je vais continuer à chercher), mais le comportement est documenté dans le Get-Help pour Get-ChildItem:

-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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top