🏈

PowerShell⇔コマンドプロンプト覚書

に公開

PowerShellって?

Windowsに標準搭載のシェルスクリプト

  • コマンドレットという独自の形式のコマンドで操作することができる
  • コマンドプロンプトの後継として開発された (らしい)
  • パイプ | や条件分岐、繰り返しなどよりプログラミングに近い感覚で扱える
    • デバッガもある

https://learn.microsoft.com/ja-jp/powershell/scripting/overview?view=powershell-7.5

このページでの呼び方

PowerShell コマンドプロンプト(DOS)
実行環境 PowerShell コマンドプロンプト
命令 コマンドレット コマンド
拡張子 ps1 cmd or bat

コマンドとの違い

  • PowerShellではコマンドとコマンドレットを実行できる
    • コマンドプロンプトではコマンドを実行できるが、コマンドレットを実行できない
  • PowerShellではエイリアスとして、Linuxコマンドの ls などを扱える
    • コマンドプロンプトでは dir 一択
  • PowerShellではコマンドレットが体系的に整理されている
    • New-Item, Get-Item, Remove-Item など 動詞-名詞 形式で整理されていてあたりを付けやすい
  • PowerShellの公式リファレンスが丁寧
    • 「〇〇について知りたかったすべてのこと」でだいたいヒットする

https://learn.microsoft.com/ja-jp/powershell/scripting/learn/deep-dives/everything-about-pscustomobject?view=powershell-7.5


構文比較

変数・標準出力

コマンドプロンプト

@echo off
# コマンドは大文字小文字どちらでもOK
SET myVariable="Hello, CMD!"
ECHO %myVariable%

PowerShell

# イコール前後にスペースがあってもOK
$myVariable = "Hello, PowerShell!"
Write-Host $myVariable

条件分岐

コマンドプロンプト

SET myVar=Hello

IF "%myVar%"=="Hello" (
  ECHO "変数myVarは「Hello」です。"
) ELSE (
  ECHO "変数myVarは「Hello」ではありません。"
)

PowerShell

$myVar = "Hello"

# 条件分岐
if ($myVar -eq "Hello") {
    Write-Host "変数myVarは「Hello」です。"
} else {
    Write-Host "変数myVarは「Hello」ではありません。"
}

繰り返し

コマンドプロンプト

# ファイルに保存して実行する場合は %%i に置換する
ECHO 0から9まで数えます:

FOR /L %i IN (0,1,9) DO (
    ECHO %i
)

ECHO 繰り返し処理が完了しました。

PowerShell

Write-Host "0から9まで数えます:"

for ($i = 0; $i -le 9; $i++) {
    Write-Host $i
}

Write-Host "繰り返し処理が完了しました。"

配列と繰り返し

コマンドプロンプト ※hackyなやり方はあるけど書かない

PowerShell

foreachの場合
Write-Host "0から9までの要素を一つずつ出力します (forループと配列インデックス):"

# $numbers = 0..9 と同等
$myArray = @(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

for ($i = 0; $i -lt $myArray.Length; $i++) {
    Write-Host $myArray[$i]
}

Write-Host "繰り返し処理が完了しました。"
パイプラインの場合
Write-Host "0から9までの要素を一つずつ出力します (forループと配列インデックス):"

$myArray = @(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
# パイプライン処理
$myArray | Write-Host

Write-Host "繰り返し処理が完了しました。"

オブジェクト(KeyValue)

コマンドプロンプト ※hackyなやり方はあるけど書かない

PowerShell

繰り返し
# Array<PSCustomObject>
$users = @(
  @{ Name = "Alice"; Age = 30; City = "Tokyo" },
  @{ Name = "Bob"; Age = 24; City = "Osaka" },
  @{ Name = "Charlie"; Age = 35; City = "Nagoya" }
)

foreach ($user in $users) {
    Write-Host "$($user.Name)$($user.City) に住んでいて、年齢は $($user.Age) 歳です。"

    # 条件に基づいて処理を行うことも可能
    if ($user.Age -ge 30) {
        Write-Host "このユーザーは30歳以上です。"
    }
}

JSで言うところの Array#filter のような使い方も

フィルタリング
$users = @(
  @{ Name = "Alice"; Age = 30; City = "Tokyo" },
  @{ Name = "Bob"; Age = 24; City = "Osaka" },
  @{ Name = "Charlie"; Age = 35; City = "Nagoya" }
)

# これが好きで使っているまである
$users | Where-Object { $_.Age -ge 30 } | ForEach-Object {
    Write-Host "$($_.Name) は30歳以上です。"
}

ファイル操作

フォルダ一覧⇒フォルダ作成⇒空ファイル作成⇒ファイル書き込み⇒中身確認⇒削除

  • WhatIf オプションで仮実行できる。dry-run的な
powershellだけ
Write-Host "--- 変数の設定 ---"
# $env:xxxは環境変数。デフォルトで使える
$parentFolder = "$env:HOMEPATH\Desktop" 
$newFolderName = "MyNewFolder"
$fileName = "MyFile.txt" 
$fileContent = "これはテストコンテンツです。"
$fullFilePath = Join-Path -Path $parentFolder -ChildPath $newFolderName | Join-Path -ChildPath $fileName
$fullDirectoryPath = Split-Path -Path $fullFilePath -Parent

Write-Host "--- 現在の '$parentFolder' フォルダ内の項目一覧 ---"
Get-ChildItem -Path $parentFolder | Select-Object Name, Mode, LastWriteTime
Write-Host "--"

Write-Host "--- フォルダを作成中: $fullDirectoryPath ---"
New-Item -ItemType Directory -Path $fullDirectoryPath -Force
Write-Host "フォルダ作成完了。"

Write-Host "--- 空のファイルを作成中: $fullFilePath ---"
New-Item -ItemType File -Path $fullFilePath -Force
Write-Host "ファイル作成完了。"

Write-Host "--- ファイルに内容を書き込み中 ---"
Set-Content -Path $fullFilePath -Value $fileContent
Write-Host "ファイルへの書き込み完了。"

Write-Host "--- ファイルの中身を確認中: $fullFilePath ---"
Get-Content -Path $fullFilePath

Start-Sleep

Write-Host "--- 作成したフォルダとファイルを削除中: $fullDirectoryPath ---"
Remove-Item -Path $fullDirectoryPath -Recurse -Force -WhatIf
Write-Host "削除完了。"

Write-Host "--- 全ての操作が完了しました ---"

まとめ

PowerShell流行れ (過激派)

https://learn.microsoft.com/ja-jp/powershell/scripting/developer/cmdlet/approved-verbs-for-windows-powershell-commands?view=powershell-7.5

Discussion