Dziś w pracy dostałem 20 plików SQL tworzących poszczególne tabele w bazie danych. Niestety, ze względu na monitorek 17 calowy, załadowanie ich do SQL Management Studio a następnie odpalanie ich tak długo aż wszystkie się zakończą (ze względu na zależności pomiędzy konkretnymi tabelami) jakoś mi się osobiście nie widziało :)
Dlatego stwierdziłem, że zrobię sobie dobrze i wykorzystam DOS do tego by połączyć pliki:
copy file1.txt + file2.txt + file3.txt out.txt
Niestety, nie podobało mi się to zbytnio gdyż trzeba było podać nazwy plików :( Więc zamieniłem polecenie na:
copy *.txt out.txt
I z zadowoleniem otworzyłem pliczek out.txt. Od razu mi mina zrzedła, zamiast ładnie połączonych plików dostałem wszystkie pliki w jednej linijce – było to spowodowane tym, iż w plikach tekstowych samplowych nie posiadałem znaku enter. Wynik był taki:
plik1plik2plik3->
To co mi się jeszcze nie podobało to ta ładna strzałka na końcu pliku (tutaj jest ona przeze mnie wprowadzona gdyż jest to znak specjalny, widoczny w Notepad, ale już w Management Studio i na blogu nie :D). Więc zacząłem kombinować inaczej:
for %f in (*.txt) do type "%f" >> out.txt
Po raz kolejny wynik nie był zadowalający:
plik1plik2plik3plik1plik2plik3
To co mnie teraz denerwowało to, to iż wciąż wszystko było w jednej linijce, zaś dodatkowo zostało wszystko powtórzone. Stało się tak ze względu na to, że prosty skrypt załapał także pliczek out.txt :) i go sobie z duplikował ;)
Myślałem, że już będę pisał skrypt VBScript lub jakąś prostą aplikację C#, jednak stwierdziłem, że sprawdzę jeszcze jak to jest z tym PowerShell. Na początku prosta próba (cat, jest aliasem na polecenie Get-Content):
cat file1.txt,file2.txt > out.txt
Obejrzałem plik out.txt i uśmiech od razu mi się pojawił na twarzy :)
Plik1
Plik2
No dobrze, to teraz trzeba było jeszcze to zeskryptować tak by pobierał wszystkie pliki, pierwsza próba:
cat *.txt > out.txt
Zakończyła się… nieskończoną pętlą (zorientowałem się po 2 minutach… ech).
Po przejrzeniu dokumentacji, wykonałem takie o to polecenie:
cat *.txt -Exclude out.txt > out.txt
uff to już zadziałało tak jak chciałem :) i nieskończonej pętli już nie było :)
Mam nadzieję, że się to komuś przyda :) mnie się przydało ;)
PS.: Innym poleceniem PowerShell które można wykorzystać jest:
Add-Content -Path .out.txt -Value (Get-Content *.txt)
Tym razem nie musimy się męczyć z Exclude.
Co do znaków specjalnych w pliku, to wystarczy w poleceniu copy podać parametr /B.
Działa odkąd pamiętam, to znaczy co najmniej od DOSa 3.30 ;)
Odpowiednikiem unixowego cat w cmd jest polecenie type (http://en.wikipedia.org/wiki/List_of_DOS_commands#type), więc ta komenda wyglądałaby jakoś tak:
type 1.txt 2.txt 3.txt > out.txt
Można się jeszcze pobawić z przekierowaniem output’a na null albo @echo off i plik bat, żeby nie wypluwał zawartości na ekran :)
@GT
o dzieki nie wiedzialem :)
@matma
for %f in (*.txt) do type “%f” >> out.txt
to jest przyklad gdzie jest wykorzystywany type – niestety, wciaz dziala on na laczeniu zawartosci w miejscu gdzie ostatni plik sie skonczyl – czyli w moim przypadku linia ciagla.
a o tym @echo off to juz kompletnie zapomnialem, dzieki za przypomnienie :)
Gutek
Comments are closed.