🏈
PowerShell⇔コマンドプロンプト覚書
PowerShellって?
Windowsに標準搭載のシェルスクリプト
- コマンドレットという独自の形式のコマンドで操作することができる
- コマンドプロンプトの後継として開発された (らしい)
- パイプ
|
や条件分岐、繰り返しなどよりプログラミングに近い感覚で扱える- デバッガもある
このページでの呼び方
PowerShell | コマンドプロンプト(DOS) | |
---|---|---|
実行環境 | PowerShell | コマンドプロンプト |
命令 | コマンドレット | コマンド |
拡張子 | ps1 | cmd or bat |
コマンドとの違い
- PowerShellではコマンドとコマンドレットを実行できる
- コマンドプロンプトではコマンドを実行できるが、コマンドレットを実行できない
- PowerShellではエイリアスとして、Linuxコマンドの
ls
などを扱える- コマンドプロンプトでは
dir
一択
- コマンドプロンプトでは
- PowerShellではコマンドレットが体系的に整理されている
- New-Item, Get-Item, Remove-Item など
動詞-名詞
形式で整理されていてあたりを付けやすい
- New-Item, Get-Item, Remove-Item など
- PowerShellの公式リファレンスが丁寧
- 「〇〇について知りたかったすべてのこと」でだいたいヒットする
構文比較
変数・標準出力
コマンドプロンプト
@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流行れ (過激派)
Discussion