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.

3 KOMENTARZE

  1. 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 ;)

  2. @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.