PowerShell スクリプトの開発入門に便利だと思ったツールや情報をまとめます。
エディタ
- VS Code extension / PowerShell: Syntax highlighting, intellisense, LSP サポートなどがあり便利
ユニットテスト
- Pester / Quick Start: テストフレームワーク
Docker
- mcr.microsoft.com/powershell: PowerShell の Docker イメージ。ライブラリの廃止に伴う移行作業やテストなど、隔離された環境での実行が必要な場合に便利
ライブラリ
- microsoftgraph/msgraph-sdk-powershell
- Microsoft Graph API を PowerShell から叩くときに使う
- 参考リンク
スニペット
しょっちゅう文法を忘れて同じことを繰り返すので、スニペットを作成しておく。
モジュールの一括インストール
install-modules.ps1
#!/usr/bin/env pwsh
Write-Host "Running "$MyInvocation.MyCommand.Name" ..."
Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted
$modules = @(
"Microsoft.Graph"
"MicrosoftTeams"
"Pester"
)
foreach ($module in $modules) {
Write-Host "Installing $module"
Install-Module -Name $module -Scope CurrentUser
}
PowerShell module の作成と利用
PowerShell モジュール
mymodule.psm1
$global:MyModuleVersion = "v0.0.1"
function Get-MyName {
return "Hello-World"
}
# Export variables
Export-ModuleMember -Variable MyModuleVersion
# Export functions
Export-ModuleMember -Function Get-MyName
PowerShell モジュールの利用
client.ps1
using module "./mymodule.psm1"
param (
[parameter(mandatory=$true)][string]$Hello,
[parameter(mandatory=$true)][string]$World)
$name = Get-MyName
Write-Host $name, $MyModuleVersion
Write-Host Args: $Hello, $World
実行
./client.ps1 -Hello Hello -World World
>>>
Hello-World v0.0.1
Args: Hello World
テスト
テストスクリプト
mymodule.test.ps1
using module "./mymodule.psm1"
Describe "Smoke test" {
Context "Nominal case" {
It "Check global variables" {
# version variable settings
$MyModuleVersion | Should Be "v0.0.1"
}
It "Connect-Helper" {
Get-MyName | Should Be "Hello-World"
}
}
}
テストの実行
Invoke-Pester ./mymodule.test.ps1
>>>
Describing Smoke test
Context Nominal case
[+] Check global variables 495ms
[+] Connect-Helper 72ms
Tests completed in 568ms
Passed: 2 Failed: 0 Skipped: 0 Pending: 0 Inconclusive: 0
HTTP リクエストの発行
Microsoft Graph API の呼び出し例
httpRequest.ps1
param (
[parameter(mandatory=$true)][string]$TenantId,
[parameter(mandatory=$true)][string]$ClientId,
[parameter(mandatory=$true)][string]$ClientSecret,
[parameter(mandatory=$true)][string]$Csv)
# -- Token を取得する --
$token = Invoke-RestMethod -Method Post -Uri "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" -Body @{client_id="$clientId";scope="https://graph.microsoft.com/.default";client_secret="$clientSecret";grant_type="client_credentials"} -ContentType 'application/x-www-form-urlencoded'
$accessToken = $token.access_token
実行例
./httpRequest.ps1 -TenantId 789 -ClientId 566 -ClientSecret 444