Рекурсия файловой системы с помощью Powershell
-
01-07-2019 - |
Вопрос
У кого-нибудь есть образец сценария для рекурсии заданного каталога в файловой системе с помощью Powershell?В конечном итоге я хочу создать сценарий, который будет генерировать для меня списки файлов NSIS с учетом каталога.Что-то очень похожее на то, что было сделано здесь с помощью BASH-скрипта.
Решение
Как халр9000 продемонстрировано, вы можете использовать -recurse
параметр переключения Get-ChildItem
командлет для получения всех файлов и каталогов по указанному пути.
Похоже, что сценарий bash, на который вы ссылаетесь в своем вопросе, также сохраняет каталоги, поэтому вот простая функция для возврата файлов и каталогов в одном объекте результата:
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
}
Вот как вы можете использовать его для создания тех же текстовых файлов установки/удаления из примера halr9000, включая каталоги удаления:
$files = Get-InstallFiles 'C:\some\directory'
$files.InstallFiles | Set-Content 'installfiles.txt'
$files.UninstallFiles + $files.Directories | Set-Content 'uninstallfiles.txt'
Другие советы
Это «перефраз» этого сценария 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