Recurriendo el sistema de archivos con Powershell
-
01-07-2019 - |
Pregunta
¿Alguien tiene un script de muestra para recurrir a un directorio determinado en un sistema de archivos con Powershell?En última instancia, lo que quiero hacer es crear un script que genere listas de archivos NSIS para mí, dado un directorio.Algo muy parecido a lo que se hizo aquí con un script BASH.
Solución
Como halr9000 demostrado, puede utilizar el -recurse
cambiar el parámetro del Get-ChildItem
cmdlet para recuperar todos los archivos y directorios en una ruta especificada.
Parece que el script bash al que vinculó en su pregunta también guarda los directorios, por lo que aquí hay una función simple para devolver tanto los archivos como los directorios en un único objeto de resultado:
function Get-InstallFiles {
param( [string]$path )
$allItems = Get-ChildItem -path $path -recurse
$directories = $allItems | ? { $_.PSIsContainer } | % { $_.FullName }
$installFiles = $allItems | ? { -not $_.PSIsContainer } | % { $_.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
}
Así es como puede usarlo para crear los mismos archivos de texto de instalación/desinstalación del ejemplo de halr9000, incluidos los directorios de desinstalación:
$files = Get-InstallFiles 'C:\some\directory'
$files.InstallFiles | Set-Content 'installfiles.txt'
$files.UninstallFiles + $files.Directories | Set-Content 'uninstallfiles.txt'
Otros consejos
Esta es una versión "parafraseada" de ese script bash.
$path = "c:\path\to\program"
$installFiles = "installfiles_list.txt"
$uninstFiles = "uninstfiles_list.txt"
$files = get-childitem -path $path -recurse | where-object { ! $_.psIsContainer } # won't include dirs
$filepath = $files | foreach-object { $_.FullName }
$filepath | set-content $installFiles -encoding ASCII
$filepath[($filepath.length-1)..0] | set-content $uninstFiles -encoding ASCII