👨‍🔬 Einsteinium
Tärpit
Invoke-Expression
Invoke-Expression
-funktio on hyödyllinen, kun haluat ajaa dynaamisesti generoituja komentoja. Staattinen koodianalyysi tulee varoittamaan tästä, koska se on potentiaalinen tietoturvariski, ja voi altistaa sinut injection-hyökkäyksille. Käytä siis harkiten. Alla esimerkki:
# Lista komennon palasista
$dockerCmd = @(
"docker run",
"--rm"
)
# Lisää komentoon osia valitsemallasi logiikalla
# Käytä esimerkiksi if-lauseita.
$dockerCmd += "--some-other-part"
# Lopulta yhdistä komennon palaset toisiinsa käyttäen välilyöntiä
# erotinmerkkinä ja aja komento.
Invoke-Expression ($dockerCmd -join ' ')
What If
Jos haluat varmistaa, että komento toimii oikein, mutta et halua sitä vielä ajaa, voit käyttää -WhatIf
-parametria. Alla on minimaalinen skripti, joka tukee toiminnallisuutta ja käyttää sitä yhdessä funktiossa:
# This activates the script to support WhatIf
[CmdletBinding(SupportsShouldProcess)]
param(
[string]$Name='Unknown Person'
)
function Write-Name {
[CmdletBinding(SupportsShouldProcess)]
param (
[string]$Name
)
# This is where the WhatIf is checked.
if ($PSCmdlet.ShouldProcess($Name)) {
Write-Output "Hello, $Name!"
}
}
# This passes the WhatIf to the function
Write-Name -Name $Name -WhatIf:$WhatIfPreference
Tehtävät
Tehtävä: PowerShell Docker Wrapper
Olet varmasti kurssin aikana huomannut oudon riippuvuuden Bashiin: sinulla on lokaali PowerShell asennettuna syntax highlightiä varten, mutta kun haluat ajaa PowerShelliä kontin sisällä, päädyt ajamaan ./runpwsh.sh
-skriptin Bash-terminaalissa.
Toteuta runpwsh.sh
-skriptin vastine PowerShellille. Tämä runpwsh.ps1
-skripti tulisi olla vastaavalla tavalla käytettävissä kuin edeltäjänsä. Alla karkea esimerkki:
PS /> ./runpwsh.ps1 scripts/hello.ps1
Hello, World!
PS /> ./runpwsh.ps1
PS /app> # <= In the container
Tee skriptistä helposti luettava. Käytä funktioita, jotta skripti on helposti ylläpidettävissä ja luettavissa. Älä myöskään unohda helppiä (ks. about_Comment_Based_Help) !
Vinkki: Dry Run
Jos käytät tärpeissä esiteltyä tapaa eli kasaat komennon osatekijät listaksi ja lopulta ajat sen Invoke-Expression
-funktiolla, kannattaa toteuttaa "Dry Run"-toiminnallisuus. Tämän voi tehdä joko kotikutoisesti tai seuraten PowerShell-käytäntöjä eli käyttämällä SupportsShouldProcess
-attribuuttia. Näin skriptin voi ajaa -WhatIf
-parametrilla, ja se tulostaa potentiaalisesti vaaralliset rivit ajamisen sijasta.