Récursivité du système de fichiers avec Powershell
-
01-07-2019 - |
Question
Quelqu'un a-t-il un exemple de script permettant de faire rentrer un répertoire dans un système de fichiers avec Powershell? En fin de compte, ce que je veux faire, c'est créer un script qui générera pour moi des listes de fichiers NSIS à partir d'un répertoire. Quelque chose de très similaire à ce qui a été fait ici avec un script BASH.
La solution
Comme l’a montré halr9000 , vous pouvez utiliser le . -recurse
paramètre de la cmdlet Get-ChildItem
pour extraire tous les fichiers et répertoires sous un chemin spécifié.
Il semble que le script bash auquel vous êtes lié dans votre question enregistre également les répertoires. Voici donc une fonction simple permettant de renvoyer les fichiers et les répertoires dans un seul objet de résultat:
function Get-InstallFiles {
param( [string]$path )
$allItems = Get-ChildItem -path $path -recurse
$directories = $allItems | ? { Comme l’a montré halr9000 , vous pouvez utiliser le . -recurse
paramètre de la cmdlet Get-ChildItem
pour extraire tous les fichiers et répertoires sous un chemin spécifié.
Il semble que le script bash auquel vous êtes lié dans votre question enregistre également les répertoires. Voici donc une fonction simple permettant de renvoyer les fichiers et les répertoires dans un seul objet de résultat:
$files = Get-InstallFiles 'C:\some\directory'
$files.InstallFiles | Set-Content 'installfiles.txt'
$files.UninstallFiles + $files.Directories | Set-Content 'uninstallfiles.txt'
Voici comment vous pouvez l'utiliser pour créer les mêmes fichiers texte d'installation / de désinstallation à partir de l'exemple de halr9000, y compris les répertoires de désinstallation:
<*>.PSIsContainer } | % { Comme l’a montré halr9000 , vous pouvez utiliser le . -recurse
paramètre de la cmdlet Get-ChildItem
pour extraire tous les fichiers et répertoires sous un chemin spécifié.
Il semble que le script bash auquel vous êtes lié dans votre question enregistre également les répertoires. Voici donc une fonction simple permettant de renvoyer les fichiers et les répertoires dans un seul objet de résultat:
<*>
Voici comment vous pouvez l'utiliser pour créer les mêmes fichiers texte d'installation / de désinstallation à partir de l'exemple de halr9000, y compris les répertoires de désinstallation:
<*>.FullName }
$installFiles = $allItems | ? { -not Comme l’a montré halr9000 , vous pouvez utiliser le . -recurse
paramètre de la cmdlet Get-ChildItem
pour extraire tous les fichiers et répertoires sous un chemin spécifié.
Il semble que le script bash auquel vous êtes lié dans votre question enregistre également les répertoires. Voici donc une fonction simple permettant de renvoyer les fichiers et les répertoires dans un seul objet de résultat:
<*>
Voici comment vous pouvez l'utiliser pour créer les mêmes fichiers texte d'installation / de désinstallation à partir de l'exemple de halr9000, y compris les répertoires de désinstallation:
<*>.PSIsContainer } | % { Comme l’a montré halr9000 , vous pouvez utiliser le . -recurse
paramètre de la cmdlet Get-ChildItem
pour extraire tous les fichiers et répertoires sous un chemin spécifié.
Il semble que le script bash auquel vous êtes lié dans votre question enregistre également les répertoires. Voici donc une fonction simple permettant de renvoyer les fichiers et les répertoires dans un seul objet de résultat:
<*>
Voici comment vous pouvez l'utiliser pour créer les mêmes fichiers texte d'installation / de désinstallation à partir de l'exemple de halr9000, y compris les répertoires de désinstallation:
<*>.FullName }
$uninstallFiles = $installFiles[-1..-$installFiles.Length]
$result = New-Object PSObject
$result | Add-Member NoteProperty Directories $directories
$result | Add-Member NoteProperty InstallFiles $installFiles
$result | Add-Member NoteProperty UninstallFiles $uninstallFiles
return $result
}
Voici comment vous pouvez l'utiliser pour créer les mêmes fichiers texte d'installation / de désinstallation à partir de l'exemple de halr9000, y compris les répertoires de désinstallation:
<*>Autres conseils
Ceci est une "paraphrase" port de ce script bash.
$path = "c:\path\to\program"
$installFiles = "installfiles_list.txt"
$uninstFiles = "uninstfiles_list.txt"
$files = get-childitem -path $path -recurse | where-object { ! Ceci est une "paraphrase" port de ce script bash.
<*>.psIsContainer } # won't include dirs
$filepath = $files | foreach-object { Ceci est une "paraphrase" port de ce script bash.
<*>.FullName }
$filepath | set-content $installFiles -encoding ASCII
$filepath[($filepath.length-1)..0] | set-content $uninstFiles -encoding ASCII