HyppÀÀ sisÀltöön

🎆 Strontium

TĂ€rpit

Format Operator

LöydÀt tÀstÀ lisÀtietoa about_Operators-dokumentaatiosta. Alla lyhyt kÀyttöohje:

$a = 42
$b = "The Universe"
$c = "Life"
$d = "Everything"

# Tulostaessa tarvit sulut
Write-Host ("The answer to {0}, {1}, and {2} is: {3}" -f $c, $b, $d, $a)

Mukavuus

Visual Studio Coden kÀyttö

Warning

Mukavuus-otsikon alla on oletus, ettÀ sinulla on kÀytössÀ Visual Studio Code, PowerShell Extension ja lokaalisti asennettu PowerShell.

Bash-kielessÀ on hyvin pieni mÀÀrÀ sisÀÀnrakennettuja komentoja, joten kyseistÀ kieltÀ kirjoittaa melko kevyesti ilman code autocompletion ominaisuutta. PowerShellin kanssa tÀtÀ kannattaa opetella hyödyntÀmÀÀn. Voit lukea lisÀÀ VS Code: IntelliSense-dokumentaatiosta.

Kuva 1: Kun kirjoitat Get-, aukeaa valikko, josta voit valita haluamasi cmdletin. PowerShell Extensionin kÀyttö nopeuttaa kirjoittamista ja vÀhentÀÀ virheitÀ.

Muita hyödyllisiÀ pikaneuvoja ovat:

  • F8 : Aja maalattu osa komentoa VS Code Terminalissa (ei kontissa!)
  • F1 : Avaa komentopaneeli.
    • Kirjoita hakukenttÀÀn PowerShell ja katso mitĂ€ kaikkea löydĂ€t.
  • Ctrl+, : Avaa asetukset.
    • Kirjoita hakukenttÀÀn @ext:ms-vscode.powershell ja saat esille kaikki PowerShell Extensionin asetukset. (🍎 Mac: Cmd+,:)

PowerShell Extensionin asetuksiin pÀÀset painamalla Ctrl+, ja kirjoittamalla hakukenttÀÀn PowerShell. TÀÀltÀ löydÀt kaikki asetukset, joita voit muokata.

Promptin muokkaus

Jos/kun kÀytÀt lokaalia PowerShelliÀ syntax highlightingin toimivuuden takaamiseksi tai ympÀristöÀ muokkaamattomien srkriptien ajamiseksi, olet varmasti huomannut, ettÀ prompt on tyypillisesti melko pitkÀ. Se on esimerkiksi:

PS /home/john/Code/johnanderton/skriptiohjelmointi-2025/pwsh>

Eikö olisi mukavampaa, jos prompt olisi:

PS pwsh>

BashistÀ sinulle pitÀisi olla tuttua Start-up -tiedosto .bashrc ja ympÀristömuuttuja PS1, joka sÀÀtÀÀ sinun promptiasi. PowerShellissÀ hitusen vastaava tiedosto on profiilitiedosto, jonka sijainti sinulle selviÀÀ komennolla:

đŸ–„ïž PowerShell
PS> $profile

# tai ks. kaikki
PS> $profile | Select-Object *

# avaa haluamasi VS Codessa
PS> code $profile.CurrentUserAllHosts

# kun olet muokannut, kÀynnistÀ joko shell tai sourcea profiilitiedosto
PS> . $profile.CurrentUserAllHosts

Promptin muotoilusta vastaa funktio prompt. Voit ylikirjoittaa tÀmÀn funktion yhden istunnon ajaksi terminaalissa. PysyvÀmpi muutos syntyy muokkaamalla profiilitiedostoa, koska se ladataan joka kerta PowerShellin kÀynnistyessÀ. Tutustu tÀhÀn liittyviin helppeihin (about_Prompts, about_Profiles).

đŸ–„ïž /path/to/your/profile.ps1
function prompt {
    switch ((Get-Location).Provider.Name) {
        FileSystem { $p = Split-Path -leaf -path (Get-Location) }
        Default { $p = (Get-Location).Drive.Name }
    }

    "PS $p> "
  }

PyörÀÀ ei kannata keksiÀ uusiksi. YllÀ oleva prompt on muokattu superuser: Configure Windows PowerShell to display only the current folder name in the shell prompt-keskustelun vastauksista. Vaihtoehtoinen tapa olisi kÀyttÀÀ valmiita teemoja esimerkiksi oh-my-posh:n avulla.

Warning

Muista, ettÀ sinun on pitÀnyt ajaa /app/scripts/localhelp.ps1, joka lataa koneelle tallennetun helpin, tai komento Update-Help, joka lataa helpin netistÀ, jotta help oikeasti sisÀltÀÀ jotakin. Vaihtoehto on toki lukea esimerkiksi about_Prompts verkosta.

TehtÀvÀt

TehtÀvÀ: Arvaa numero

Luo ohjelma, joka generoi luvun vÀliltÀ 1-1000 ja pyytÀÀ kÀyttÀjÀÀ arvaamaan sen. Ohjelma antaa vihjeen, onko arvattu luku suurempi vai pienempi kuin generoitu luku. Ohjelma lopettaa, kun kÀyttÀjÀ arvaa oikein. TÀmÀ on jo kerran tehty Bashilla, joten voit kÀyttÀÀ sitÀ pohjana logiikan suhteen.

LisÀÀ ohjelmaan ominaisuus, ettÀ se kellottaa kÀyttÀjÀn peliajan ja tulostaa sen lopuksi ruudulle. Pelatessa tulosteen pitÀisi myötÀillÀ alla olevaa esimerkkiÀ:

Arvaa luku vÀliltÀ 1-1000
=================================================
Arvaa luku: 369
📉 Liian pieni 

Arvaa luku: 371
📈 Liian suuri 

Arvaa luku: 370
🎉 Oikein! Arvasit luvun 370 

Peliaika: 00:00:10.1029581

Varmista, ettÀ pelaaja voi halutessaan lopettaa pelin. Minun toteutuksessa mikÀ tahansa muu syöte kuin kokonaisluvuksi parsittava syöte lopettaa pelin (esim. exit tai tyhjÀ merkkijono).

Vihje
help *random*
Vihje

Peliajan kellottamiseen voit kÀyttÀÀ System.Diagnostics.Stopwatch-luokkaa. Ohje löytyy PowerShell Communityn DevBlogs: Measuring average download time -artikkelista.

TehtÀvÀ: Reminder

Aivan kuten ylempi, myös tÀmÀ tehtÀvÀ on sinulle tuttu Bash-osiosta. Luo kaksi ohjelmaa, jotka toimivat yhdessÀ. Toinen luo, toinen nÀyttÀÀ muistiinpanoja.

  • install_remind.ps1
    • Luo aliakset remind ja remember, jotka suorittavat remind.ps1- ja remember.ps1-skriptit.
  • remember
    • Kysyy kĂ€yttĂ€jĂ€ltĂ€ muistutuksia, jotka tallennetaan $HOME/.reminder-tiedostoon.
    • TyhjĂ€ syöte lopettaa muistutusten kirjoittamisen.
    • Formaatti: [timestamp] Muistutus
  • reminder
    • Tulostaa koko muistutustiedoston sisĂ€llön.

Alla esimerkki asennuksen ja kummankin sovelluksen toiminnasta. Komentojen vÀliin on lisÀtty tyhjÀ rivi lukemisen helpottamiseksi:

🐳 PowerShell
PS /> . /app/scripts/remind_install.ps1

PS /> remember
Enter note (quit with empty note)
>>> : Buy an egg
>>> : Buy a chicken
>>> : Which one first? Help!
>>> :

PS /> remind
Your reminders are as follows:
[1739541147]    Buy an egg
[1739541151]    Buy a chicken
[1739541156]    Which one first? Help!
TehtÀvÀ: Verb-Noun generaattori

KehitÀ generaattori, rnd-cmdlet.ps1, joka luo uudenlaisia cmdlet-pÀteviÀ nimiÀ, kuten Get-Pizza tai Set-Spam. Tee ohjelma siten, ettÀ, verbi arvotaan PowerShellin kÀytössÀ olevista verbeistÀ. Substantiivi sen sijaan noudattaa seuraavaa logiikkaa:

  • Jos kĂ€yttĂ€jĂ€ antaa argumentin skriptille, kĂ€ytĂ€ sitĂ€.
  • Jos ei, yritĂ€ noutaa substantiivi REST API:sta.
    • Osoite: https://random-word-api.herokuapp.com/word
  • Jos ei onnistu, poimi satunnainen sana sanakirjasta.

REST API:n kutsumiseen saat apua alemmasta vinkistÀ, jos et itse keksi ratkaisua.

Jos tarvitset helpomman tehtÀvÀn

Vinkki Verbi

Kokeile komentoa Get-Verb.

Vinkki REST API
function getNoun {
    try {
        $url = "https://random-word-api.herokuapp.com/word"
        $response = Invoke-RestMethod -Uri $url -Method Get
        $noun = (Get-Culture).TextInfo.ToTitleCase($response[0])
    }
    catch {
        Write-Warning "Using a predefined list."
        $noun = Get-Random -InputObject $nounVocabulary
    }

    return $noun
}
TehtÀvÀ: Staattinen analyysi (PSScriptAnalyzer)

Bashin kanssa kÀytimme ohjelmaa shellcheck, joka analysoi skriptin ja antaa palautetta mahdollisista virheistÀ. PowerShellille vastaava työkalu on PSScriptAnalyzer. Sen pitÀisi olla asennettuna ja aktiivsena, mutta voit tarkistaa, löytyykö se Get-Module cmdletillÀ:

PS> Get-Module

Jos ei ole:

PS> Install-Module -Name PSScriptAnalyzer -Force

TÀmÀn jÀlkeen tarkista skriptisi:

PS> Invoke-ScriptAnalyzer -Path ./scripts/*.ps1

Korjaa kaikki virheet ja varoitukset. Jos jokin virhe toistuu useita kertoja, harkitse Find & Replace -toiminnon kÀyttöÀ Visual Studio Codessa. Ole kuitenkin varovainen, ettet korvaa jotain, mitÀ et halua korvata!

Tip

Saatat huomata varoituksia, joiden kuvaus on: Missing BOM encoding for non-ASCII encoded file 'some_file.ps1.

NÀmÀ liittyvÀt Windows PowerShell -yhteensopivuuteen. TÀllÀ kurssilla helpoin tapa sivuuttaa ongelma on hiljentÀÀ nÀmÀ varoitukset. TÀmÀ onnistuu helpoiten luomalla seuraava tiedosto skriptihakemistoon:

scripts/PSScriptAnalyzerSettings.psd1
@{
    ExcludeRules=@('PSUseBOMForUnicodeEncodedFile')
}

Huomaa, ettÀ tiedoston nimen tulee olla juurikin tuo sama. Muutoin Invoke-ScriptAnalyzer ei osaa etsiÀ sitÀ.