**
Dyzklejmer**
- Nie oddycham PowerShellem i nie mam nawyków powershellowych.
- Potrafię korzystać z wyszukiwarki internetowej.
- To nie jest tutorial.
- Serio, nie wszystko musi mieć sens.
- Put the fun back into computing.
**Po co ten wpis **
Chciałem sprawdzić, jaki jest próg wejścia w PowerShella na Linuksie, a po kilku dniach przeczytać ten wpis, by stwierdzić, jak bardzo było głupie to, co chciałem osiągnąć.
"A więc…"
Ten wpis to w zasadzie follow up do poprzedniego wpisuIterowanie po tablicach w Bashu](openSUSE Forums). Tablice w Bashu nie są oczywiste w każdym aspekcie. Na przykład: na ogół muszę przemyśleć, jak przekazać tablicę do utworzonej funkcji.
Czemu więc nie rzucić okiem na ten sam problem z kompletnie innej perspektywy?
I tyle wstępu.
Instalacja
Microsoft nie dostarcza RPMów z PowerShellem dla SUSE i openSUSE:
docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-linux
Owszem, można znaleźć RPMy na software.opensuse.org.
Ja wybrałem instalację ze snapa:
snapcraft.io/install/snap-store/opensuse
sudo snap install powershell --classic
Shebang
which pwsh
#!/snap/bin/pwsh
Edytor
Używam nano i dodałem sobie coś takiego:
Kod
Zamiast tablicy w Bashu
Niechlujną na szybko robioną tablicę z Basha, musiałem zastąpić czymś takim - każdy string musiał być w cudzysłowiu i oddzielony przecinkiem:
$RPMS = "TESTOWY_NIE_MA_TAKIEGO_PAKIETU","nie_ma","cheese-lang",
"gdm-lang","gnome-contacts-lang","gnome-control-center-color",
"gnome-control-center-goa","gnome-control-center-lang","gnome-session-lang",
"gnome-session-wayland","gnome-shell-calendar","gnome-shell-classic","gnome-shell-extension-gpaste",
"gnome-shell-lang","gnome-shell-search-provider-bijiben","gnome-shell-search-provider-contacts","gnome-shell-search-provider-documents",
"gnome-shell-search-provider-nautilus","gnome-tweaks-lang","gstreamer-plugins-bad-lang","libpurple-lang","libpurple-tcl","pidgin",
"pulseaudio-gdm-hooks","cheese","gnome-shell-extension-desktop-icons","gnome-contacts","gnome-tweaks","libpurple","patterns-gnome-gnome",
"patterns-gnome-gnome_imaging","patterns-gnome-gnome_office","patterns-gnome-gnome_utilities",
"libpurple-branding-openSUSE","patterns-gnome-gnome_x11","gstreamer-plugins-farstream","patterns-gnome-gnome_basic",
"libfarstream-0_2-5","patterns-gnome-gnome_basis","gdm-branding-openSUSE","gdm","gnome-shell","gnome-session-default-session","gnome-session",
"gnome-control-center","libcheese-gtk25","libcheese8","gstreamer-plugins-bad"
Iterowanie
I tu zaczyna być ciekawie. Zamiast przeszukiwać ${RPMS@]}, przekierowuję cały obiekt $RPMS do pętli
$RPMS | ForEach { rpm -q --queryformat "%{NAME}
" $_ }
Kod wyjśćia
Zamiast zera mam true a $? jest od razu interpretowane:
PS /home/geeko/scripts> $?
True
Operator warunkowy
<condition> ? <if-true> : <if-false>
Co dało mi możliwość łatwego przekazania kodu wyjścia, czyli:
$? ? <if-true> : <if-false>
Budowanie obiektów
Tu miałem trudność. Ostatecznie utworzyłem dwie puste listy i skorzystałem z metody .Add:
$INSRPMS = New-Object System.Collections.Generic.List[System.Object]
$INSRPMS.Add("kolejnaPaczka")
**
&> /dev/null**
out-null
**Kolorowanie i formatowanie wyników
**-ForegroundColor przyjmuje wartości w postaci nazw kolorów, a przed zmienną przechowującą nazwę paczki dodałem po prostu dwie spacje:
Write-Host -ForegroundColor Green " $_"
Całość
#!/snap/bin/pwsh
$RPMS = "TESTOWY_NIE_MA_TAKIEGO_PAKIETU","nie_ma","cheese-lang",
"gdm-lang","gnome-contacts-lang","gnome-control-center-color",
"gnome-control-center-goa","gnome-control-center-lang","gnome-session-lang",
"gnome-session-wayland","gnome-shell-calendar","gnome-shell-classic","gnome-shell-extension-gpaste",
"gnome-shell-lang","gnome-shell-search-provider-bijiben","gnome-shell-search-provider-contacts","gnome-shell-search-provider-documents",
"gnome-shell-search-provider-nautilus","gnome-tweaks-lang","gstreamer-plugins-bad-lang","libpurple-lang","libpurple-tcl","pidgin",
"pulseaudio-gdm-hooks","cheese","gnome-shell-extension-desktop-icons","gnome-contacts","gnome-tweaks","libpurple","patterns-gnome-gnome",
"patterns-gnome-gnome_imaging","patterns-gnome-gnome_office","patterns-gnome-gnome_utilities",
"libpurple-branding-openSUSE","patterns-gnome-gnome_x11","gstreamer-plugins-farstream","patterns-gnome-gnome_basic",
"libfarstream-0_2-5","patterns-gnome-gnome_basis","gdm-branding-openSUSE","gdm","gnome-shell","gnome-session-default-session","gnome-session",
"gnome-control-center","libcheese-gtk25","libcheese8","gstreamer-plugins-bad"
$INSRPMS = New-Object System.Collections.Generic.List[System.Object]
$MISRPMS = New-Object System.Collections.Generic.List[System.Object]
$RPMS | ForEach {
rpm -q --queryformat "%{NAME}
" $_ | out-null
$? ? $INSRPMS.Add($_) : $MISRPMS.Add($_)
}
Write-Host "Installed RPMs:"
$INSRPMS | ForEach { Write-Host -ForegroundColor Green " $_" }
Write-Host "`nMissing RPMs:"
$MISRPMS | ForEach { Write-Host -ForegroundColor Red " $_" }
**
Jakie strony były pomocne**
Złożenie w/w poszło mi dość sprawnie. Najbardziej pomocne były strony Microsoftu. Z drugiej strony, nowicjuszem w skryptowaniu nie jestem, więc nieco łatwiej mi wyrazić, co jest mi potrzebne do osięgnięcia rezultatu.