Повторение файловой системы с помощью Powershell - PullRequest
2 голосов
/ 19 сентября 2008

У кого-нибудь есть пример сценария для рекурсии заданного каталога в файловой системе с Powershell? В конечном счете, я хочу создать скрипт, который будет генерировать списки файлов NSIS для меня по заданному каталогу. Нечто очень похожее на то, что было сделано здесь скриптом BASH.

Ответы [ 2 ]

4 голосов
/ 20 сентября 2008

Это «парафразный» порт этого 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
3 голосов
/ 30 сентября 2008

Как показало halr9000 , вы можете использовать параметр переключателя -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'
...