Czy PowerShell jest gotowy do zastąpienia mojej powłoki Cygwin w systemie Windows? [Zamknięte]


384

Zastanawiam się, czy powinienem nauczyć się PowerShell, czy po prostu trzymać się skryptów Cygwin / Perl / skryptów powłoki Unix itp.

Zaletą PowerShell byłoby to, że skrypty mogłyby być łatwiej używane przez członków drużyny, którzy nie mają Cygwina; nie wiem jednak, czy naprawdę pisałbym tyle skryptów ogólnego przeznaczenia, czy ludzie mogliby ich nawet używać.

Skrypty uniksowe są tak potężne, czy PowerShell jest wystarczająco blisko, aby uzasadnić przełączenie?

Oto niektóre z konkretnych rzeczy (lub odpowiedników), których chciałbym szukać w PowerShell:

  • grep
  • sortować
  • uniq
  • Perl (jak blisko PowerShell zbliża się do możliwości Perla?)
  • AWK
  • sed
  • plik (polecenie, które podaje informacje o pliku)
  • itp.

7
Nie powiedziałbym tego, byłem zainteresowany podniesieniem Powershell, znalazłem tę stronę, a teraz znam ogólne różnice między PS a skryptami powłoki, do których jestem przyzwyczajony.
Bender the Greatest

5
Ten post nagle powstał z popiołów w linku HN. Świetna robota. I źle dla @Bobby za zamknięcie tego jako niekonstruktywne.
Sid

26
Jeśli ktoś nie może zapytać, jak dobrze jedno narzędzie replikuje funkcje drugiego, SO nie może odpowiedzieć na pytania dotyczące porównania narzędzi. Jest to starannie sformułowane, aby uniknąć kontrowersji, ale beztrosko było uważane za „kontrowersyjne” po prostu za wyglądanie jak pytanie w systemie Unix vs. Windows. I uzyskał rzeczową, obiektywną odpowiedź, z dodatkowym wglądem w fakt, jak pomocne mogą być skrypty uniksowe w systemie Windows.
Chernevik

16
Dlaczego to znowu jest zamknięte? Ktoś powinien edytować tytuł, aby powiedzieć „PowerShell vs Unix Shells na platformie Windows”, aby odciągnąć trolle od traktowania go jako „Windows vs Unix”, co nie jest. To doskonale konstruktywne pytanie - przegłosowano, aby ponownie otworzyć.
x0n

3
Operacja miesza powłokę z narzędziami. PowerShell ma swoje zastosowanie. Ale GNU to projekt, aby swobodnie przenosić gadżety UNIX do innych systemów operacyjnych, w tym Windows. Każda rzecz na liście, którą podaje op, ma implementację GNU w systemie Windows. Dostępne z GnuWin32 lub poszczególnych stron. Windows BAT nie jest bezużyteczny, ma przekierowanie, potok i warunki.
MeaCulpa

Odpowiedzi:


783

Narzędzia to tylko narzędzia.
Pomagają lub nie pomagają.
Potrzebujesz pomocy lub nie.

Jeśli wiesz, że Unix i te narzędzia robią to, co musisz, aby zrobić w systemie Windows - jesteś szczęśliwym facetem i nie musisz uczyć się programu PowerShell (chyba że chcesz eksplorować).

Moim pierwotnym zamiarem było dołączenie zestawu narzędzi uniksowych do systemu Windows i załatwienie go (wielu z nas w zespole ma głębokie doświadczenie w Uniksie i zdrową dawkę szacunku dla tej społeczności).

Odkryłem, że to niewiele pomogło. Powodem tego jest to, że AWK / grep / sed nie działają z COM , WMI , ADSI , rejestrem, magazynem certyfikatów itp. Itp.

Innymi słowy, UNIX jest całym ekosystemem, który sam dostosowuje się do plików tekstowych. Jako takie, narzędzia do przetwarzania tekstu są skutecznie narzędziami do zarządzania. Windows to zupełnie inny ekosystem, dostrajający się wokół interfejsów API i obiektów. Właśnie dlatego wymyśliliśmy PowerShell.

Myślę, że przekonasz się, że będzie wiele okazji, gdy przetwarzanie tekstu nie zapewni Ci tego, czego chcesz w systemie Windows. W tym momencie będziesz chciał wybrać PowerShell. UWAGA - nie jest to umowa typu wszystko albo nic. W programie PowerShell możesz wywoływać narzędzia uniksowe (i korzystać z ich procesu tekstowego lub przetwarzania tekstu PowerShell). Możesz także wywołać PowerShell z narzędzi uniksowych i uzyskać tekst.

Ponownie - nie ma tu religii - skupiamy się na dostarczeniu narzędzi potrzebnych do odniesienia sukcesu. Dlatego tak bardzo pasjonujemy się opiniami. Poinformuj nas, gdzie spadamy w pracy lub gdzie nie masz potrzebnego narzędzia, a my umieścimy je na liście i przejdziemy do niego.

Szczerze mówiąc, wykopujemy się z 30-letniej dziury, więc to zajmie trochę czasu. To powiedziawszy, jeśli podniesiesz wersję beta systemu Windows Server 2008 / R2 i / lub bety naszych produktów serwerowych, myślę, że będziesz zaskoczony, jak szybko zapełni się tę dziurę.

Jeśli chodzi o użytkowanie - do tej pory mieliśmy ponad 3,5 miliona pobrań. Nie obejmuje to osób korzystających z niego w systemie Windows Server 2008, ponieważ jest on zawarty jako składnik opcjonalny i nie wymaga pobierania.

Wersja 2 zostanie dostarczona we wszystkich wersjach systemu Windows. Będzie domyślnie włączony we wszystkich wersjach oprócz Server core, gdzie jest to składnik opcjonalny. Wkrótce po dostarczeniu systemu Windows 7 / Windows Server 2008 R2 udostępnimy wersję V2 na wszystkich platformach, Windows XP i nowszych. Innymi słowy - Twoja inwestycja w naukę będzie miała zastosowanie do bardzo dużej liczby maszyn / środowisk.

Ostatni komentarz. Jeśli zaczniesz uczyć się programu PowerShell, myślę, że będziesz bardzo szczęśliwy. Wiele projektów jest pod silnym wpływem naszych uniksowych środowisk, więc chociaż jesteśmy zupełnie inni, bardzo szybko je odbierzesz (po tym, jak przestaniesz gadać, że to nie jest Unix :-)).

Wiemy, że ludzie mają bardzo ograniczony budżet na naukę - dlatego bardzo zależy nam na spójności. Nauczysz się czegoś, a potem będziesz go używać w kółko.

Eksperyment! Cieszyć się! Angażować!


11
Dzięki za odpowiedź. Myślę, że zamierzam iść dalej i nauczyć się PowerShell. Wygląda potężnie z tego, co widziałem do tej pory, i będę mógł pisać z nim bardziej użyteczne skrypty w pracy.
Andy White,

55
@Jeffrey: czy jest szansa na lepszy terminal dla systemu Windows? Powershell to potężny język skryptowy, ale fakt, że działa w programie cmd.exe, czyni go znacznie wygodniejszym w trybie interaktywnym
sumek

47
To „mało konstruktywne” pytanie wygenerowało najlepszy wgląd w całość „na Unixie, wszystko jest mantrą pliku” i dlaczego Windows jest inny. Może lepiej byłoby StackOverflow zamykać nie konstruktywne dyskusje ?
Chernevik

12
@sumek - Spróbuj ConEmu; Używam go od kilku tygodni i jest całkiem słodki: hanselman.com/blog/…
EZ Hart

4
Uwaga: PowerShell nie lubi przesyłania danych binarnych. Uważaj więc, gdy dzwonisz do swoich zaufanych narzędzi uniksowych, po prostu nie rób rzeczy takich jak tar -c . | gzip > package.tar.gz bezpośrednio w PowerShell, bo inaczej będziesz cierpieć. Patrz brianreiter.org/2010/01/29/…
Interarticle

123

grep

Select-Stringpolecenia cmdlet i -matchoperator działają z wyrażeniami regularnymi. Możesz także bezpośrednio skorzystać z obsługi wyrażeń regularnych .NET dla bardziej zaawansowanych funkcji.

sortować

Sort-Objectjest mocniejszy (niż pamiętam * nix sort). Zezwalanie na wielopoziomowe sortowanie według dowolnych wyrażeń. Tutaj pomaga utrzymanie podstawowego typu programu PowerShell; np. DateTimewłaściwość zostanie posortowana jako DateTimenie wymagająca formatowania do formatu sortowalnego.

uniq

Select-Object -Unique

Perl (jak blisko PowerShell zbliża się do możliwości Perla?)

Pod względem szerokiego zakresu bibliotek wsparcia specyficznych dla domeny: nigdzie blisko (jeszcze).

W przypadku ogólnego programowania PowerShell jest z pewnością bardziej spójny i spójny oraz łatwiejszy do rozszerzenia. Jedyną luką w mungowaniu tekstu jest coś równoważnego ..operatorowi Perla .

AWK

Minęło już wystarczająco dużo czasu od używania AWK (musi to być> 18 lat, ponieważ później użyłem Perla), więc nie mogę tak naprawdę komentować.

sed

[Patrz wyżej]

plik (polecenie, które podaje informacje o pliku)

Siła PowerShell tutaj nie tyle z tego, co może zrobić z obiektami systemu plików (i dostaje pełne informacje tutaj, dirzwraca FileInfolub FolderInfoobiektów, odpowiednio) jest to, że jest to cały model dostawcy.

Rejestr, magazyn certyfikatów, SQL Server, pamięć podręczną RSS programu Internet Explorer itp. Można traktować jako przestrzeń obiektową, w której można nawigować za pomocą tych samych poleceń cmdlet, co system plików.


PowerShell jest zdecydowanie krokiem naprzód w systemie Windows. Microsoft uwzględnił to w swoich wymaganiach dotyczących przyszłych produktów innych niż domowe. Stąd bogate wsparcie w Exchange, wsparcie w SQL Server. To się tylko rozszerzy.

Ostatnim przykładem tego jest TFS PowerToys. Wiele operacji klienta TFS odbywa się bez konieczności uruchamiania tf.exe za każdym razem (co wymaga nowego połączenia z serwerem TFS itp.) I jest znacznie łatwiejsze do dalszego przetwarzania danych. Pozwala także na szeroki dostęp do całego interfejsu API klienta TFS z większą szczegółowością niż ujawniona w jednym z Eksploratorów Team of TF.exe.


2
Chodzi o to, że model dostawcy jest interesujący tylko dlatego, że system operacyjny nie używa tekstu jako uniwersalnego nośnika konfiguracji, więc POTRZEBUJESZ tych dostawców. W systemie UNIX większość języków ma interfejsy API do obsługi PAM, hostów i pakietów, ale ostatecznie tekst zawsze będzie dostępny.
Daishiman

12
Tekst nie zawsze jest najlepszym formatem do wszystkiego (zacznij od baz danych i obrazów rastrowych). Ale myślę, że możemy zgodzić się raczej na wojny niż w otwartym formacie.
Richard

5
Program Powershell może używać dowolnego obiektu w środowisku .NET, czy to nie pasuje do możliwości domeny Perla? Dodatkowo możesz pisać cmdlety w języku C # itp., Jeśli chcesz ponownie użyć
Chris S

Porównanie punkt po punkcie. Niezłe. To powinna być zaakceptowana odpowiedź. Siła programu PowerShell tkwi w jego podstawach .NET i tym, jak łatwo można rozszerzyć system, pisząc nowe polecenia cmdlet lub nawet wywołując biblioteki klas
Sau001,

Typowe użycie sed (tak myślę) byłoby:, sed 's/pattern/replacement/' filektóre jest z grubsza gc file | %{$_ -replace 'pattern','replacement'}i podobnie dla awk: awk 'BEGIN {} /pat1/ {action1} /pat2/ {action2} END {}' filejest z grubsza{BEGIN {}; switch -r -c -file file { 'pat1' {action1} 'pat2' {action2}}; END{};}
Nathan Chappell

56

Jako osoba, której kariera koncentrowała się na rozwoju systemu Windows w latach 1997–2010, oczywistą odpowiedzią byłby PowerShell z wszystkich podanych wcześniej dobrych powodów (np. Jest częścią strategii korporacyjnej Microsoft; dobrze integruje się z Windows / COM / .NET; oraz używanie obiektów zamiast plików zapewnia „bogatszy” model kodowania). Z tego powodu używałem i promowałem PowerShell przez ostatnie dwa lata, z wyraźnym przekonaniem, że postępowałem zgodnie ze „Słowem Billa”.

Jednak jako pragmatyk nie jestem już pewien, że PowerShell jest tak świetną odpowiedzią. Chociaż jest to doskonałe narzędzie systemu Windows i stanowi bardzo potrzebny krok w kierunku wypełnienia historycznej dziury, jaką jest wiersz poleceń systemu Windows, ponieważ wszyscy obserwujemy, jak Microsoft trzyma się poślizgu obliczeń konsumenckich, wydaje się coraz bardziej prawdopodobne, że Microsoft ma przed sobą ogromną bitwę o utrzymanie swojego systemu operacyjnego jako ważne dla przyszłości.

Rzeczywiście, biorąc pod uwagę, że moja praca jest coraz bardziej w środowiskach heterogenicznych, uważam, że o wiele bardziej przydatne jest używanie skryptów Bash w tej chwili, ponieważ działają one nie tylko w systemie Linux, Solaris i Mac OS X, ale działają również z pomoc Cygwin - w systemie Windows.

Jeśli więc wierzysz, że przyszłość systemu operacyjnego jest utowarowiona, a nie zmonopolizowana, wydaje się sensowne, aby wybrać zwinną strategię narzędzi programistycznych, która w miarę możliwości trzyma się z dala od zastrzeżonych narzędzi. Jeśli jednak widzisz swoją przyszłość zdominowaną przez wszystko to, co jest Redmond, wybierz PowerShell.


1
Czy skrypty unix działają idealnie na Cygwin-Windows bez błędów?
Pacerier

@Pacerier Używam Cygwin i MinGW od 12 lat i miałem zaskakująco rzadko problemy. Ważne jest to, że jeśli coś nie działa, zawsze można polegać na narzędziach Windows lub cokolwiek - procesy można uruchomić w taki sam sposób, jak uruchamia je każda inna powłoka.
Jewgienij Siergiejew

4
Dobra, twoja odpowiedź pochodzi z 2011 roku. Dzisiaj PowerShell działa również na systemie Linux. I - moim zdaniem - uderzenie jest zbyt antyczne. Składnia jest okropna i wolałbym używać innego języka skryptowego. W dzisiejszych czasach, gdy Python jest standardem w większości dystrybucji Linuksa, nie widzę żadnego powodu, aby używać bash w skryptach. Radzę sprawdzić ponownie PowerShell, ponieważ wiele się wydarzyło od 2011 roku.
itmuckel


33

Użyłem trochę PowerShell do automatyzacji skryptów. Chociaż bardzo miło jest, że środowisko wydaje się być znacznie bardziej przemyślane niż powłoki uniksowe, w praktyce użycie obiektów zamiast strumieni tekstowych jest znacznie bardziej niezręczne, a wiele udogodnień uniksowych opracowanych w ciągu ostatnich 30 lat lata wciąż brakuje.

Cygwin jest nadal moim ulubionym środowiskiem skryptowym dla hostów Windows. Z pewnością przewyższa alternatywy pod względem wykonywania zadań.


27
Używanie obiektów jest zmianą paradygmatu i wymaga pewnego przyzwyczajenia się. Ale unika się ponownej analizy na każdym etapie, w którym zaangażowane są ustrukturyzowane dane (np. Nie ma potrzeby ograniczania pól).
Richard

16
@Andy White @Daishiman, rozumiem, gdzie jest krzywa uczenia się za pomocą PowerShell, ale obiekty pipingu mogą być znacznie bardziej elastyczne niż tekst pipowania. @ Richard jest poprawny. :)
Steven Murawski

18
Autorzy mieli trudności z kłótnią z tysiącami lat koni. Nie próbuję być nonszalancki. Samo wskazanie, że sukces w przeszłości nie usuwa potencjalnej korzyści z innowacji.
EBGreen,

12
@daishiman - Zaletą Objects jest to, że gdy chcesz mieć własność, prosisz o nią - nie musisz analizować, zgadywać, rzucać. Nie zrozumiałem twojego zdania na temat „co się dzieje, gdy obiekty nie mają zgodnych metod” - czy możesz powiedzieć to inaczej lub podać przykład problemu? Dzięki.
Jeffrey Snover - MSFT

13
@ Daishiman - Rozumiem. W praktyce ludzie stwierdzili, że nie jest to problem, ale ogromna zaleta. To powiedziawszy, widzę, że gdybyś był ekspertem w parserze tekstów, byłaby to nowa umiejętność do nauczenia się i na początku może wydawać się niepotrzebna i niewygodna. Znowu - cokolwiek pomaga, jest właściwym narzędziem.
Jeffrey Snover - MSFT

15

Jest tu wiele świetnych świetnych odpowiedzi i oto moje zdanie. PowerShell jest gotowy, jeśli jesteś ... Przykłady:

grep = " Select-String -Pattern "

sort = "Sort-Object"

uniq = „ Get-Unique

file = „ Get-Item

cat = „ Get-Content

Perl / AWK / Sed nie są poleceniami, ale narzędzia są trudne do porównania, ale w PowerShell można zrobić prawie wszystko.


2
Czy wierzysz w tajemnicze czteroliterowe polecenia, których zmuszeni byli nasi przodkowie?
Jewgienij Siergiejew

4
@EvgeniSergeev Wszystkie powyższe są domyślnie dostępne jako sls, sort, gu, gi, gc, odpowiednio. Długie, czytelne nazwy, które uzupełniają tabulatory, oraz krótkie, które można wpisać w jednym systemie. To postęp przyjazny dla użytkownika.
TessellatingHeckler

Jednym z aliasów Get-Contentjest cat, więc dla tego nie ma żadnej różnicy między Cygwin / Unix i PowerShell. Niestety w większości przypadków w dokumentacji Microsoft dla poleceń cmdlet brakuje informacji o aliasach, ale lista wszystkich aliasów jest generowana przy użyciuGet-Alias w sesji PowerShell. Alias ​​dla „Get-Unique” to „gu”, więc jest krótszy niż Cygwin / Unix!
Peter Mortensen,

13

Dopiero niedawno zacząłem pisać w PowerShell z jakimkolwiek stopniem powagi. Chociaż przez ostatnie siedem lat pracowałem w prawie wyłącznie środowisku Windows, wywodzę się z uniksowego środowiska i ciągle próbuję „Unix-fy” doświadczyć interakcji z Windows. To co najmniej frustrujące.

Można jedynie porównywać PowerShell z czymś takim jak Bash , tcsh lub zsh, ponieważ narzędzia takie jak grep , sed , awk , find itp. Nie są, ściśle mówiąc, częścią powłoki; zawsze będą jednak częścią dowolnego środowiska uniksowego. To powiedziawszy, polecenie PowerShell, takie jak Select-String, ma bardzo podobną funkcję do grep i jest pakowane jako moduł podstawowy w PowerShell ... więc linie mogą być trochę rozmyte.

Myślę, że kluczową rzeczą jest kultura i fakt, że odpowiednie zestawy narzędzi będą ucieleśniać ich kultury:

  • Unix to kultura oparta na plikach (ogólnie rzecz biorąc, nie na Unicode) . Pliki konfiguracyjne to prawie wyłącznie pliki tekstowe . Z drugiej strony, Windows zawsze był o wiele bardziej ustrukturyzowany pod względem formatów konfiguracji - konfiguracje są zazwyczaj przechowywane w zastrzeżonych bazach danych (np. Rejestrze Windows), które wymagają specjalistycznych narzędzi do zarządzania.
  • Interfejs administracyjny Uniksa (i przez wiele lat rozwoju) tradycyjnie był wierszem poleceń i wirtualnym terminalem. Windows zaczął jako GUI, a funkcje administracyjne dopiero niedawno zaczęły odchodzić od oparcia wyłącznie na GUI. Możemy się spodziewać, że środowisko Unixa w wierszu poleceń będzie bogatsze, bardziej dojrzałe, biorąc pod uwagę znaczącą przewagę, jaką posiada w programie PowerShell, a moje doświadczenie pasuje do tego. O tym z mojego doświadczenia:

    • Doświadczenie administracyjne w systemie Unix ma na celu ułatwienie wykonywania czynności przy minimalnej liczbie naciśnięć klawiszy; dzieje się tak prawdopodobnie w wyniku historycznej sytuacji, gdy konieczne jest administrowanie serwerem za pomocą wolnego połączenia dial-up o prędkości 9600 bodów. Teraz PowerShell ma aliasy, które znacznie ułatwiają obejście dość szczegółowego standardu czasownik-rzeczownik , ale poznanie tych aliasów jest trochę uciążliwe (ktoś wie coś lepszego niż alias | where {$_.ResolvedCommandName -eq "<command>"}:?).

      Przykład bogatego sposobu, w jaki można manipulować historią:

      iptablespolecenia są często długie i powtarzanie ich z niewielkimi różnicami byłoby uciążliwe, gdyby nie tylko jedna z wielu fajnych cech manipulacji historią wbudowanych w Bash , więc wstawienie reguły iptables, jak poniżej:

      iptables -I camera-1-internet -s 192.168.0.50 -m state --state NEW -j ACCEPT

      drugi raz dla innej kamery („ camera-2”) to tylko kwestia wydania:

      !!:s/-1-/-2-/:s/50/51

      co znaczy „wykonać poprzednie polecenie, ale zamiast -1-z -2-i 50z 51.

    • Uniksowe wrażenia są zoptymalizowane dla maszynistek; prawie wszystko można zrobić bez opuszczania pozycji „domowej”. Na przykład, w Bash , używając Emacs klawiszy (tak, Bash obsługuje również vi wiązań), jazda na rowerze w historii odbywa się za pomocą Ctrl-Pi Ctrl-Njednocześnie przesuwając się na początku i końcu linii odbywa się za pomocą Ctrl-Ai Ctrl-Eodpowiednio ... i to zdecydowanie na tym się nie kończy. Wypróbuj nawet najprostszą nawigację w konsoli PowerShell bez ruszania się z pozycji wyjściowej i masz kłopoty.

    • Proste rzeczy, takie jak wszechstronne stronicowanie (a la mniej ) w Uniksie, nie wydają się być dostępne od razu po uruchomieniu w PowerShell, co jest nieco frustrujące, a bogate doświadczenie edytora również nie istnieje. Oczywiście zawsze można pobrać narzędzia innych firm, które wypełnią te luki, ale na pewno byłoby miło, gdyby te rzeczy były po prostu „tam”, jakby miały praktycznie dowolny smak Uniksa.
  • Kultura systemu Windows, przynajmniej pod względem interfejsów API systemu, jest w dużej mierze napędzana przez frameworki, tj. COM i .NET , które są wysoce strukturalne i oparte na obiektach. Z drugiej strony, dostęp do uniksowych interfejsów API tradycyjnie odbywa się poprzez interfejs plików ( /devi /proc) lub (nie zorientowane obiektowo) wywołania biblioteczne w stylu C. Nic więc dziwnego, że doświadczenia związane ze skryptami odpowiadają ich paradygmatom systemu operacyjnego. PowerShell ma z natury strukturę (wszystko jest obiektem) i oparty jest na plikach Bash - and -friends. Strukturalny interfejs API, który jest do dyspozycji programisty PowerShell, jest ogromny (zasadniczo dopasowuje się do ogromu istniejącego zestawu standardowych interfejsów COM i .NET).

Krótko mówiąc, chociaż możliwości skryptowe programu PowerShell są prawdopodobnie potężniejsze niż Bash (szczególnie, jeśli wziąć pod uwagę dostępność .NET BCL ), interaktywność jest znacznie słabsza, zwłaszcza jeśli korzystasz z klawiatury całkowicie , perspektywa oparta na konsolach (jak wiele głowic uniksowych).


Pytasz „ktoś wie coś lepszego niż: alias | gdzie {$ _. ResolvedCommandName -eq" <polecenie> "}?". A może po prostu alias -Definition *property(lub jakikolwiek inny wzór)? Myślę, że problem z twoją odpowiedzią polega na tym, że łączysz powłokę i konsolę: pamiętaj, że masz wybór konsoli z różnymi opcjami edycji. Celowo pozostawili przerwane edytowanie konsoli DOS, aby zachęcić ludzi do korzystania z innych konsol, takich jak ISE.
Duncan

BTW, twój !!przykład może być napisany w PowerShell, (h -c 1) -replace '-1-','-2-' -replace '50','51' | iexale łatwiej jest strzałkę w górę i edytować dla pojedynczego polecenia. Jeśli chcesz to zrobić za pomocą wielu poleceń, myślę, że Powershell wygrałby. Aby powtórzyć 10 poleceń kończących się poleceniem nr 255 wraz z wprowadzonymi zmianami: (h -c 10 -id 255) -replace '-1-','-2-' -replace '50','51' | iexRównież historia Powershell pozwala robić rzeczy niespotykane w powłokach Linuksa; jeśli zastanawiasz się retrospektywnie, jak długo trwało uruchomienie polecenia:h -id 20 | select { $_.EndExecutionTime - $_.StartExecutionTime }
Duncan

@Duncan W odniesieniu do twojego komentarza, chodzi o powłokę i konsolę - myślę, że to tylko podstawowa różnica między Bash i PS; to znaczy: Bash oczekuje pewnych interaktywnych wrażeń, podczas gdy PS „pozostawia” to coś innego. Nie mam dużego doświadczenia z konsolą ISE, ale pamiętam, że nie ma też niezwykle bogatego doświadczenia interaktywnego.
Eric Smith

@Duncan, tak - dobra uwaga na temat zdolności PS do dostarczania sprytnych sztuczek historycznych.
Eric Smith

@ Duncan ... ale pomimo twojego twierdzenia, że ​​niektóre rzeczy są niespotykane w powłokach Linuksa:fc -e "sed -i -e 's/-1-/-2-/g' -e 's/50/51/g'" 10 255
Eric Smith

8

Pod żadnym względem nie jestem bardzo doświadczonym użytkownikiem PowerShell, ale trochę mnie to zrobiło. Możesz połączyć ze sobą wbudowane cmdlety, aby zrobić wszystko, co możesz zrobić po monicie w systemie Unix, i jest jeszcze jedna dodatkowa korzyść z takich rzeczy, jak eksportowanie do CSV, tabel HTML i dla bardziej dogłębnych zadań administracyjnych związanych z administrowaniem systemem .

A jeśli naprawdę potrzebne coś jak sed , zawsze UnixUtils lub GnuWin32 , które można zintegrować z PowerShell dość łatwo.

Jako długoletni użytkownik Uniksa miałem jednak problem z przyzwyczajeniem się do schematu nazewnictwa poleceń i na pewno skorzystałbym z niego, gdybym wiedział więcej .NET.

Zasadniczo mówię, że warto się tego nauczyć, jeśli tylko system Windows nie stanowi problemu.


1
Istnieje projekt open source „Pash”, który pozwala uruchamiać PowerShell na innych platformach za pośrednictwem Mono. tinyurl.com/6dyoso
John D. Cook

Zaraz! Dzięki za wskazówkę; Nie mogę się doczekać, aby spróbować
yalestar

6

Jeśli lubisz skrypty powłoki, pokochasz PowerShell!

Zacznij od Zwiedzanie z przewodnikiem powłoki Microsoft Command Shell (Ars Technica).


8
Uwielbiam skrypty powłoki i toleruję PowerShell. Jego polecenia i składnia są okropne. Strasznie długie polecenia i opcje bez przydatnego wykonywania poleceń. Lub jeśli tak, nie znalazłem tego. Zbyt wiele funkcji jest wciśniętych w pojedyncze polecenia, które należy rozdzielić. Dziwna zmienna i składnia ucieczki, którą pokochałby tylko programista wsadowy DOS.
Zan Lynx

8
@Zan Lynx - Masz rację, że nie znalazłeś żadnych rzeczy. Wszystkie polecenia mają aliasy, a wiele z nich jest zgodnych zarówno z DOS, jak i UNIX (ps, dir, rm, ls, kill, history, man, cat, clear itp.) Nazwy są długie, więc mają znaczącą nazwę. Doskonały do ​​skryptów - pomaga, gdy nowa osoba musi go używać i utrzymywać. Istnieje rozszerzenie tabulatorów dla poleceń cmdlet, funkcji, zmiennych, ścieżek, parametrów itp. Znaczna część składni pochodzi z powłok uniksowych i o jakiej składni ucieczki mówisz? `` nie jest używany do ucieczki, ponieważ jest separatorem ścieżek w systemie Windows.
manojlds

3
@Zan Lynx - Twoje argumenty są nieprawidłowe. Aby zatrzymać interpretację zmiennych, użyj '(pojedynczych cudzysłowów). Do podwójnego cudzysłowu - tego samego, użyj write-output 'this is a "test"'. Pytanie, na które wskazujesz, dotyczy Regex, a funkcja ucieczki dla wyrażenia regularnego jest ważna wszędzie. Program Powershell ma również ciągi tutaj-ciągi / dosłownie. Nawet Java tego nie ma! Spróbuj uciec wyrażenia regularnego w Javie. I czasami nie używasz literalpath. Używasz, kiedy potrzebujesz. LiteralPath traktuje znaki wieloznaczne dosłownie i ich nie rozwija. Używasz go, gdy mają go Twoje pliki. Daje ci więcej opcji.
manojlds

3
@manojlds: W porównaniu z powłoką bash Powershell jest pełen niespójności, które nie mają sensu i są po prostu mylące. W bash wszędzie używasz tego samego znaku zmiany znaczenia, a ścieżki do plików są tak samo jak łańcuchy. Nie potrzebujesz do tego specjalnego parametru. Jeśli rozwiniesz zmienną ze znakami specjalnymi, umieścisz ją w podwójnych cudzysłowach, a jej zawartość będzie bezpieczna, nie trzeba wywoływać funkcji, aby wyjść z niej.
Zan Lynx

5
@Zan Lynx - Nie ma niespójności. Nawet write-output "this is a `"test`""działa. Po prostu użyj `zamiast `\`. regex :: escape istnieje, aby ci pomóc, abyś nie przegapił ucieczki. Nie trzeba go używać. Myślicie, że dodatkowe opcje, które pomogą wam i zapobiec błędom, to niespójności.
manojlds

6

Ponieważ moje ostatnie eksperymenty doprowadziły mnie do głębi wywołań PowerShell i .NET, muszę powiedzieć, że PowerShell może zastąpić powłoki Cygwin i Unix.

Nie jestem pewien co do Perla, ale ponieważ zarówno PowerShell, jak i Perl są Turingami kompletnymi jako języki programowania, zgadzam się na zastąpienie Perla.

Jedną z rzeczy, które PowerShell ma powyżej Cygwina i zwykłego Basha pod * nix, jest zdolność do wykonywania piaskownicowych wywołań DLL, manipulowania systemem operacyjnym poprzez bezpośrednie wywołania API, metody WMI, a nawet obiekty COM. Co powiesz na uruchomienie programu Internet Explorer za pomocą kodu, a następnie robienie wszystkiego, co chcesz z wyświetlanym dokumentem, skutecznie emulując zaplecze dla serwera WWW?

Co powiesz na zbieranie danych z serwerów SQL i innych dostawców danych, parsowanie ich i eksportowanie jako CSV, wiadomości e-mail, tekst i właściwie wszelkiego rodzaju istniejące i nieistniejące formaty plików? (Przy odpowiednich umiejętnościach tworzenia prawidłowego pliku z otrzymanych danych, oczywiście, ale CSV są łatwo dostępne).

Dostępne są dodatkowe zabezpieczenia za pomocą podpisanych poleceń cmdlet i skryptów, zasad grupy i zasad wykonania, które pomagają zapobiegać uruchamianiu złośliwego kodu w systemie, nawet jeśli są uruchamiane jako administrator.

O tym, jakie polecenia są zaimplementowane - odpowiedź Richarda wymienia je i zdolność PowerShell do emulacji już ich funkcjonalności.

O tym, czy PowerShell jest silny, aby uzasadnić przełączenie - jest to bardziej kwestia osobistych preferencji, chociaż ponieważ coraz więcej usług systemu Windows udostępnia polecenia cmdlet PowerShell do ich kontrolowania, nieużywanie programu PowerShell z tymi usługami jest uważane za przeszkodę. (Serwer Hyper-V jest podstawową tego rodzaju usługą, a także zapewnia więcej możliwości dzięki poleceniom cmdlet PowerShell niż w GUI!)

Prawdopodobnie ta odpowiedź jest opóźniona o pięć lat, ale jeśli ktoś wykonuje zadania administracyjne lub ogólne skryptowanie różnych rzeczy w systemie Windows, zdecydowanie powinien spróbować wykorzystać PowerShell do swoich celów.


6

Porównując PowerShell z kombinacją Cygwin / Perl / Shell, pamiętaj, że PowerShell reprezentuje tylko część „Shell” tej kombinacji.

Możesz jednak wywołać dowolne polecenie z programu PowerShell, tak jak z cmd.exe lub Cygwin. To nie nie ponownie wdrożyć określone funkcje, a to z pewnością nie jest porównywalna do Perl.

To „tylko” powłoka, ale ułatwia programowanie, zapewniając wygodny interfejs do wszechświata .NET.

Należy również pamiętać, że PowerShell wymaga systemu Windows XP, Windows Server 2003 lub nowszego, co może stanowić problem w zależności od infrastruktury IT.

Aktualizacja:

Nie miałem pojęcia, jaka debata filozoficzna wywołałaby moją odpowiedź.

Odpowiedziałem w kontekście pytania: Porównaj PowerShell z Cygwin oraz Perl i Bash.

PowerShell jest powłoką, ponieważ nie robi różnicy składniowej między wbudowanymi poleceniami, komendami, funkcjami użytkownika i zewnętrznymi poleceniami (.exe, .bat, .cmd). Tylko wywoływanie metod .NET różni się poprzez dodanie przestrzeni nazw lub obiektu w wywołaniu.

Jego programowalność wynika z frameworku .NET, a nie z niczego specyficznego dla „języka” programu PowerShell.

Powiedziałbym, że wierzę, że PowerShell jest „językiem skryptowym”, gdy tylko Bugzilla lub MediaWiki zostaną zaimplementowane jako skrypty PowerShell działające na serwerze WWW;)

Do tego czasu korzystaj z porównań .


Tak, myślę, że kiedy mówię o „powłoce” uniksowej, mam również na myśli wszystkie normalne narzędzia dostarczane z Unixem, takie jak grep, awk itp. Zastanawiam się tylko, czy PowerShell oferuje podobne narzędzia poza -pudełko.
Andy White

3
PowerShell nie jest „tylko powłoką”. To jest język skryptowy. Zastanawiam się, w jaki sposób nie można go porównać do Perla? Przyznaję, że nie jest tak dojrzały, ale poza tym nie widzę różnicy.
EBGreen,

@EBGreen, Co dokładnie masz na myśli przez ten komentarz? Zgadzam się, że każdy język powłoki lub język skryptowy jest z natury podobny, ale zastanawiałem się więcej o konkretnych możliwościach PowerShell vs. bash / perl / inne powłoki unix / języki skryptowe.
Andy White

2
PowerShell ma niezwykle szeroki zakres funkcji. Jest to - Interaktywna, składalna powłoka - Bogaty interaktywny język skryptowy - Język programowania Posiada bogaty zestaw funkcji narzędziowych OO i tesxt (tj. Odpowiedników grep / awk / etc).
Jeffrey Snover - MSFT

1
@Andy - zrozumiałem, że Devio powiedział, że PowerShell nie jest tak potężny jak Perl. Nie wierzę, że to prawda i po prostu zastanawiałem się, dlaczego tak jest.
EBGreen,

4

Polecenia cmdlet w programie PowerShell są bardzo ładne i działają niezawodnie. Ich orientacja obiektowa bardzo mi się podoba, ponieważ jestem programistą Java / C #, ale nie jest to kompletny zestaw. Ponieważ jest zorientowany obiektowo, brakuje wielu dojrzałości strumienia tekstowego zestawu narzędzi POSIX ( awki sedżeby wymienić tylko kilka).

Najlepszą odpowiedzią na dylemat kochania technik OO i dojrzałości narzędzi POSIX jest użycie obu! Jednym wielkim aspektem programu PowerShell jest to, że wykonuje doskonałą pracę, przesyłając obiekty do standardowych strumieni. Program PowerShell domyślnie używa potoku obiektów do transportu swoich obiektów. To nie są standardowe strumienie (standardowe wyjście, błąd standardowy i wejście standardowe). Kiedy PowerShell musi przekazać dane wyjściowe do standardowego procesu, który nie ma potoku obiektów, najpierw przekształca obiekty w strumień tekstowy. Ponieważ robi to tak dobrze, PowerShell stanowi doskonałe miejsce do hostowania narzędzi POSIX!

Najlepszy zestaw narzędzi POSIX to GnuWin32 . Instalacja zajmuje więcej niż 5 sekund, ale jest warta kłopotu i, o ile mogę stwierdzić, nie modyfikuje systemu (rejestru, c:\windows\*folderów itp.), Z wyjątkiem kopiowania plików do określonych katalogów. Jest to bardzo miłe, ponieważ jeśli umieścisz narzędzia we współdzielonym katalogu, wiele osób będzie mogło uzyskać do nich dostęp jednocześnie.

Instrukcje instalacji GnuWin32

Pobierz i uruchom plik exe (pochodzi ze strony SourceForge ), kierując go do odpowiedniego katalogu (będę używać C:\bin). Stworzy to GetGnuWin32katalog, w którym nie można uruchomić download.bat, a następnie install.bat(bez parametrów), po czym pojawi się C:\bin\GetGnuWin32\gnuwin32\binkatalog, który jest najbardziej przydatny folder, który nigdy nie istniał na komputerze z systemem Windows. Dodaj ten katalog do swojej ścieżki i jesteś gotowy.


4

TL; DR - nie nienawidzę Windows ani PowerShell. Po prostu nie mogę nic zrobić w systemie Windows ani w programie PowerShell.


Osobiście nadal uważam, że PowerShell jest w najlepszym razie rozczarowujący.

  • Uzupełnianie tabulatorami ścieżek do katalogu nie jest złożone, wymagając od użytkownika wprowadzenia separatora ścieżek po każdym uzupełnieniu nazwy.
  • Nadal mam wrażenie, że system Windows nawet nie ma pojęcia ścieżki ani tego, czym jest ścieżka, a brak dostępnego wskaźnika domu użytkownika jest ~/trochę@environment://somejibberish/%user_home%
  • NTFS wciąż jest bałaganem i pozornie zawsze nim będzie. Powodzenia w nawigacji.

  • Interfejs cmd-esque, cmd.exe dinozaura jest nadal widoczny w programie PowerShell, EdycjaMark nadal jest jedynym sposobem kopiowania informacji i kopiowania tylko w postaci prostokątnych bloków widocznej przestrzeni terminala. i EdycjaOznacz nadal jest jedynym sposobem wklejania ciągów do terminala.

  • Malowanie go na niebiesko nie czyni go bardziej atrakcyjnym. Nie mam nic przeciwko programistom Microsoft, którzy mają smak w kolorze.

  • System Windows zawsze otwiera się w lewym górnym rogu ekranu. Dla kogoś, kto używa pionowych pasków zadań, jest to niezwykle irytujące, szczególnie biorąc pod uwagę, że pasek zadań Windows obejmie jedyny narożnik okna, który daje dostęp do funkcji kopiowania / wklejania.

Nie mogę wiele mówić na temat narzędzi, które zawiera system Windows. Ponieważ istnieje cały zestaw otwartych, darmowo licencjonowanych narzędzi CLI, a PowerShell zawiera, o ile wiem, żadne z nich nie jest absolutnym rozczarowaniem.

  • PowerShell wgetprzenosi pozornie nieporównywalne argumenty do GNU wget. Dzięki, promyk nadziei przenośny - bezużyteczny.
  • PowerShell POSIX nie jest kompatybilny z Bash, szczególnie &&operator nie jest obsługiwany, dzięki czemu najprostsze polecenie warunkowe nie następuje.

Nie znam człowieka; Dałem temu szansę, naprawdę. Nadal staram się dać temu szansę w nadziei, że następnym razem, gdy go otworzę, będzie mniej przydatny. Nie mogę nic zrobić w PowerShell i ledwo mogę zrobić rzeczy z prawdziwym projektem, aby wprowadzić narzędzia GNU do Windows.

MySysGit daje mi monit dinozaura cmd.exe z kilkoma narzędziami GNU i wciąż jest bardzo rozczarowujący, ale w końcu ukończenie ścieżki działa. A polecenie Git uruchomi się w Git Bash.

Mintty dla MySysGit daje interfejs Cygwin w środowisku mysysgit, dzięki czemu kopiowanie i wklejanie rzeczy (wybierz, aby skopiować (mysz), Shift+, Insaby wkleić, jak nowoczesny ...). Jednak takie rzeczy git pushsą zepsute w Mintty.

Nie zamierzam narzekać, ale wciąż widzę ogromne problemy z użytecznością wiersza poleceń w systemie Windows, nawet przy takich narzędziach jak Cygwin.


PS: Tylko dlatego, że coś można zrobić w PowerShell, nie czyni go użytecznym . Użyteczność jest głębsza niż umiejętność i na tym koncentruję się, próbując użyć produktu jako konsumenta.


Włączyć tryb QuickEdit? Wybierz i naciśnij klawisz Enter, aby skopiować, ctrl-v, aby wkleić, nie więcej Edytuj-> Zaznacz lub Edytuj-> Wklej. Będąc w ustawieniach, ustaw pozycję okna i odznacz „pozwól systemowi ustawić okno”. Uzupełnianie tabulatorów to nie tylko uzupełnianie ścieżek systemu plików, ale także uzupełnianie nazw zmiennych, nazw poleceń, właściwości obiektów, które możesz wpisać .lub [uzyskać dostęp do właściwości lub indeksu, więc nie można po prostu dodać separatora ścieżek na końcu. Który dokładnie program PowerShell? Który POSIX PowerShell? Nie próbuje przynieść narzędzi GNU do systemu Windows ani być kompatybilnym z bash.
TessellatingHeckler

Tak, wiem, że to nie jest próba bicia Powstrzymałem się od powiedzenia tego w oryginalnym poście. Powiedziałbym, które w binarne, ale nie ma polecenia „który” w powłoce mocy :( nie pamiętam, gdzie kupić i czytałem moc Powłoka miała być kompatybilna z POSIX
ThorSummoner

5
re: „no which” -> (get-command wg*.exe).Path. Odp: Zakończenie bashu i readline -> leeholmes.com/blog/2012/09/13/… prowadzący do github.com/lzybkr/PSReadLine
TessellatingHeckler

2

Nie widziałem, że PowerShell naprawdę wystartował, przynajmniej jeszcze nie. Może więc nie warto się tego uczyć, chyba że inni w twoim zespole już to wiedzą.

Jeśli masz kłopoty, możesz lepiej korzystać z języka skryptowego, który inni mogą mieć za sobą, Perla, jak wspomniałeś, lub innych, takich jak Ruby lub Python.

Myślę, że wiele z tego zależy od tego, co musisz zrobić. Osobiście używam Pythona do własnych skryptów, ale wiem, kiedy zacznę pisać coś, czego nigdy nie będę mógł przekazać - więc staram się nie robić niczego zbyt rewolucyjnego.


2

Dlaczego nie skorzystać z obu? Wywołaj skrypty PowerShell w Cygwin, tak jak inne interpretowane skrypty, takie jak Perl itp.

Robię to na tyle, że napisałem https://bitbucket.org/jbianchi/powershell dla opakowania Bash, aby wywołać powershell.exe w Cygwin. Może być używany jako shebang jako pierwsza linia skryptu powershell.exe .ps1 (ponieważ PowerShell używa również „#” jako komentarza). Przykłady znajdziesz na https://bitbucket.org/jbianchi/powershell/wiki/Home


1

W kilku wierszach Cygwin i PowerShell to różne narzędzia, jednak jeśli masz zainstalowany Cygwin, możesz uruchamiać pliki wykonywalne Cygwin w ramach sesji PowerShell. Tak przyzwyczaiłem się do PowerShell, że teraz nie używam już grep, sort, awk itp. W PowerShell są wbudowane alternatywy, a jeśli nie, możesz znaleźć cmdlet.

Głównym narzędziem, z którego korzystam, jest ssh.exe, ale w ramach sesji PowerShell.

Działa świetnie.


0

Odkryłem, że programowanie w PowerShell nie jest warte wysiłku.

Mam kilkuletnie doświadczenie w skryptowaniu powłoki w systemie Unix, ale bardzo trudno było mi zrobić wiele z PowerShell.

Wygląda na to, że wiele funkcji wymaga przesłuchania interfejsu zarządzania Windows i wydawania poleceń podobnych do SQL, aby uzyskać potrzebne informacje.

Na przykład chciałem napisać skrypt, aby usunąć wszystkie pliki z określonym sufiksem z drzewa katalogów. W systemie Unix byłoby to proste ...

find . -name \*.xyz -exec rm {} \;

Po kilku godzinach dicking wokół z Scripting.FileSystemObjecta WScript.Shelli wydawania „SELECT * FROM Win32_ShortcutFile gdzie dysk =„”& Drive &««i Path =»»& searchFolder &„””, ale w końcu poddał się i osiadł dla Eksploratora Windows Search polecenia i po prostu zrób to ręcznie. Prawdopodobnie jest jakiś sposób, aby zrobić to, co chciałem, ale nie widziałem nic oczywistego, a wszystkie przykłady na stronie MSDN były tak trywialne, że były bezwartościowe.

EDYCJA Heh, oczywiście jak tylko to napisałem, przeszukałem trochę więcej i znalazłem to, czego mi brakowało: -recurseopcja polecenia usuń element jest wadliwa (ujawniona, jeśli używasz get-help remove-item -detailed).

Próbowałem „remove-item-filter” * .xyz '-recurse ”i to nie działało, więc się poddałem.

Okazuje się, że musisz użyć get-childitem -filter '*.xyz' -recurse | remove-item


16
Myślę, że mylisz Windows Scripting Host (WSH) z PowerShell. Oni są zupełnie inni.
Erik Funkenbusch

3
Na przykład, jeśli chcesz usunąć wszystkie pliki, które kończą się na .TMN, możesz wydać to polecenie get-childitem c: \ -include * .TMN -recurse | foreach ($ _) {remove-item $ _. fullname}
Erik Funkenbusch

@Mystere: Próbowałem tego i nie działało. Po paru ciekawostkach wydaje się, że * .tmn jest tym, czego potrzebujesz (zamiast tylko .tmn)
redtuna

5
Nie mogłem z szacunkiem się więcej nie zgodzić i nie jestem facetem z Windows. Uważam, że PS jest dużo łatwiejszy do napisania niż bash. PS jest bardziej spójny. Dzięki Bash każde wywoływane narzędzie konsoli ma swoją własną składnię i unikalne zachowanie, a sama składnia bash jest raczej tajemnicza. PS jest znacznie bardziej niezawodny dzięki funkcjom językowym, takim jak funkcje anonimowe, (skrypty blokowe), sprawdzanie poprawności parametrów, funkcje zaawansowane itp. Plus koncepcje modułów dotyczące przenośności i wielu innych funkcji. Głównie jednak największym powodem jest to, że zawsze słyszysz o PS, obiekty przebijają tekst. Bash jest jednak jeszcze szybszy.
user2233949


0

PowerShell jest bardzo potężny, potężniejszy niż standardowe wbudowane powłoki uniksowe (ale tylko dlatego, że zawiera wiele funkcji zwykle wyłuskanych w podprogramach). Weź również pod uwagę, że możesz pisać aplety w dowolnym języku .NET, w tym IronPython , IronRuby , PerlNet itp., Lub możesz po prostu wywoływać polecenia Cygwin z PowerShell, ignorując wszystkie dodatkowe funkcje i będzie działał podobnie do Bash, KornShell , lub cokolwiek...


Myślę, że brakuje ci celów projektowych powłok uniksowych. Nie powalam programu PowerShell (sam chciałbym dowiedzieć się więcej), ale musisz zrozumieć narzędzia uniksowe, aby wypowiedzieć takie zdanie.
Jé Queue

2
@Xepoch - Nie, myślę, że brakuje Ci celów projektowych programu PowerShell. PowerShell może robić wszystko, co powłoki Unix mogą robić w ten sam sposób, w jaki to robią. Jednak prawdziwa moc pojawia się, gdy używasz systemu potokowania obiektów PS, a nie tylko parsowania tekstu. Tak więc PowerShell może robić dokładnie to, co potrafi bash lub korn, ale nie może robić tego, co potrafi PowerShell.
Erik Funkenbusch,

3
Po prostu nie znam programu PowerShell na tyle, aby dać ci krytykę na ten temat, ale ponieważ wyraźnie wiesz, że cele uniksowych powłok niekoniecznie są w pełni kompleksowym zamiennikiem zewnętrznych narzędzi, a raczej otaczające je struktury kontrolne. Ponownie nie mogę w tej chwili porównywać ani kontrastować, ale podniesienie poziomu PowerShell, ponieważ ma więcej wbudowanych funkcji, niekoniecznie jest dobrodziejstwem dla powłok uniksowych.
Jé Queue

@Xepoch - Chodzi o to, że możesz wybrać sposób, w jaki chcesz to zrobić. Możesz użyć całej dobroci wbudowanej powłoki lub możesz zignorować i zrobić to tak, jak robi to Unix. To Twój wybór. A wybór jest dobry, prawda?
Erik Funkenbusch,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.