Script PowerShell - Get-ChildItem
-
21-09-2019 - |
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;
}
}
}
}
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.