**NOTE** January 2022 - Changes to Gstreamer and Pipewire packages from PackmanPlease read the following thread about the current changes
pbojczuk
by , 25-Nov-2021 at 17:23 (2289 Views)
Dyzklejmer
1. Nie oddycham PowerShellem i nie mam nawyków powershellowych.
2. Potrafię korzystać z wyszukiwarki internetowej.
3. To nie jest tutorial.
4. Serio, nie wszystko musi mieć sens.
5. 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 wpisu Iterowanie po tablicach w Bashu. 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
Code:
sudo snap install powershell --classic
Shebang
Edytor
Używam nano i dodałem sobie coś takiego:
https://github.com/mitchell486/nanorc
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:
Code:
$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
Code:
$RPMS | ForEach { rpm -q --queryformat "%{NAME}\n" $_ }
Kod wyjśćia
Zamiast zera mam true a $? jest od razu interpretowane:
Code:
PS /home/geeko/scripts> $?
True
Operator warunkowy
Code:
<condition> ? <if-true> : <if-false>
Co dało mi możliwość łatwego przekazania kodu wyjścia, czyli:
Code:
$? ? <if-true> : <if-false>
Budowanie obiektów
Tu miałem trudność. Ostatecznie utworzyłem dwie puste listy i skorzystałem z metody .Add:
Code:
$INSRPMS = New-Object System.Collections.Generic.List[System.Object]
$INSRPMS.Add("kolejnaPaczka")
&> /dev/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:
Code:
Write-Host -ForegroundColor Green " $_"
Całość
Code:
#!/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}\n" $_ | 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.
|