Comments 26
for %f in (*.txt) do type "%f" >> output.txt
Причем оно даже результат к самому себе не дописывает в цикле, а вдруг нам именно это и нужно было
Не спец по PS
, но полагаю, что идея в ленивом исполнении. Т.е. сначала команда извлекает первый файл, затем — его содержимое, возможно — одну строку, затем дописывает строки в конец выходного файла, пока первый файл не закончится. Потом в какой-то момент доходит до вашего выходного файла и лениво начинает тянуть из него строки, попутно их записывая. Очевидно, строки не заканчиваются. 25% загрузки CPU говорят о том, что у вас скорее всего двухъядерный лэптоп с hyperthreading enabled.
Я попробовал поиграть с командами, решение (вроде как) оказалось простым:
> echo "Hello, World 1!" > test1.txt
> echo "Hello, World 2!" > test2.txt
> (ls | cat) > out.txt
> ls
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2018-12-19 20:36 70 out.txt
-a---- 2018-12-19 20:36 36 test1.txt
-a---- 2018-12-19 20:36 36 test2.txt
> cat out.txt
Hello, World 1!
Hello, World 2!
Попробуйте — вдруг будет работать.
UPD Здесь до меня по сути то же самое написали.
Ваше (ls | cat) > out.txt
— это ровно то же самое, что и авторское get-childitem | get-content | out-file result.txt
, только выходной файл называется по-другому.
Вам просто повезло, что имя вашего файла оказалось лексикографически меньше всех остальных файлов в директории, а потому powershell его прочитал самым первым, когда он еще был пустым.
убогостью средства cmd.exe
Хм…
for %R in (*.txt) do type %R >> result.txt
Get-ChildItem -Filter *.log | Get-Content | Out-File result.txt
Вот если бы result.txt был result.log, тогда да, еще возможна такая ситуация. Не знаю почему вам не был очевиден такой момент. Он же будет по конвееру передавать все по одному элементу, попадающему в шаблон, поэтому да, вечный loop. Можно еще так:
dir | cat > result.txt
Get-ChildItem -filter *.log | Where-Object Name -notlike 'result.log'| Get-Content |Out-File result.log
А зачем писать итоговый файл в одну папку с исходными и создавать проблему на пустом месте?
Вспомнился анекдот:
Приходит мужик к врачу и говорит:
— Доктор, я когда рукой двигаю, у меня вот тут болит
— А когда не двигаете — не болит?
— Нет.
— Ну так просто не двигайте рукой!
Насчёт — ненормальное и непредсказуемое — Вы погорячились. Просто, видимо, опыта мало.
Бомбануть может где угодно. Например, у Вас в каталоге есть файлы "rm", "-Rf", а вы матчите список файлов шеллом (через "*"). Или просто список имён файлов вылезает за пределы определенного лимита...
По статье — для начала неплохо. Кейс действительно интересный. Но очень рекомендую исправить все опечатки/описки, т.к. выглядит неаккуратненько.
Get-ChildItem -filter *.log | Where-Object Name -notlike 'result.log'| Get-Content |Out-File result.log
Против вот этого:
copy *.txt result.txt /b
(код взять из соседних комментов).
ls *.log -Exclude 'result.log' | cat > 'result.log'
полная версия:
Get-ChildItem -Filter *.log -Exclude 'result.log'| Get-Content | Out-File result.log
Как объединить содержимое файлов в PowerShell. И при этом не пострадать