Объединить файлы подпапок в один файл (за исключением файлов текущей папки)

Я хочу объединить содержимое всех файлов в моих подпапках в один файл. Однако я хочу исключить корневую папку из этого поиска.

Мне очень близка следующая команда:

Get-ChildItem -include *.sql -rec | ForEach-Object {gc $_; ""} | out-file final.sql

Проблема в том, что, поскольку foreach рекурсивен, он также обнаруживает выходной файл (final.sql), который создает бесконечный цикл. Эти команды powershell никогда не заканчиваются, и файл final.sql со временем становится все больше и больше.

Как исключить текущий каталог из поиска?

Важно: я не хочу явно указывать путь, поскольку у разных пользователей будет разная файловая система.


person Luis Gouveia    schedule 04.12.2019    source источник


Ответы (2)


Попробуй это:

$mainPath    = 'C:\files\test'
$directories = Get-ChildItem -Path $mainPath -Directory
$destFile    = $mainPath + '\final.sql'

Remove-Item -Path $destFile -ErrorAction SilentlyContinue | Out-Null

foreach( $directory in $directories ) {

    Get-ChildItem -Path $directory.FullName -include *.sql -rec | ForEach-Object {gc $_; ""} | Out-File $destFile -Append

}
person f6a4    schedule 04.12.2019

Пользователь f6a4 ответил правильно, но если вы не хотите использовать полное имя каталога, вам лучше использовать эту версию:

$directories = Get-ChildItem -Path $mainPath -Directory
Remove-Item -Path final.sql -ErrorAction SilentlyContinue | Out-Null

foreach( $directory in $directories ) {
    Get-ChildItem -Path $directory.FullName -include *.sql -rec | ForEach-Object {gc $_; ""} | Out-File final.sql -Append
}

Вы можете запустить этот файл с помощью PowerShell, создав следующий файл .ps1:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './GlobalVersionPowershellBatch.ps1'"
person Luis Gouveia    schedule 04.12.2019