はじめに
本記事では、PowerShellのコマンドとお作法を
備忘録としてまとめます。
コマンドプロンプト(cmd)との違いや
よく使うコマンドレットを中心に整理しています。
1. PowerShellの基本的な特徴
コマンドプロンプトとの違い
| 項目 | コマンドプロンプト | PowerShell |
|---|---|---|
| 出力 | テキスト | オブジェクト |
| コマンド | コマンド | コマンドレット(Verb-Noun形式) |
| スクリプト | .bat |
.ps1 |
| パイプライン | テキストを渡す | オブジェクトを渡す |
| 文字コード | Shift-JIS | UTF-8(設定による) |
PowerShellの最大の特徴はオブジェクトのパイプラインです。
コマンドの出力がテキストではなくオブジェクトなので、
プロパティを直接参照したりフィルタリングしたりできます。
2. コマンドレットの命名規則
PowerShellのコマンドは**Verb-Noun(動詞-名詞)**形式です。
Get-Process # プロセスを取得する
Set-Location # 場所(ディレクトリ)を設定する
New-Item # 新しいアイテムを作成する
Remove-Item # アイテムを削除する
よく使うVerbの一覧
| Verb | 意味 | 例 |
|---|---|---|
Get |
取得する | Get-Process |
Set |
設定する | Set-Location |
New |
新規作成する | New-Item |
Remove |
削除する | Remove-Item |
Copy |
コピーする | Copy-Item |
Move |
移動する | Move-Item |
Start |
開始する | Start-Process |
Stop |
停止する | Stop-Process |
Write |
書き込む | Write-Host |
Out |
出力する | Out-File |
3. エイリアス(短縮コマンド)
よく使うコマンドレットには短縮形(エイリアス)があります。
| エイリアス | フルコマンド | 内容 |
|---|---|---|
ls / dir / gci
|
Get-ChildItem |
ファイル・フォルダ一覧 |
cd / sl
|
Set-Location |
ディレクトリ移動 |
pwd / gl
|
Get-Location |
現在のディレクトリを表示 |
cp / copy
|
Copy-Item |
コピー |
mv / move
|
Move-Item |
移動 |
rm / del
|
Remove-Item |
削除 |
cat / type
|
Get-Content |
ファイルの内容を表示 |
echo / write
|
Write-Output |
テキストを出力 |
cls |
Clear-Host |
画面をクリア |
man / help
|
Get-Help |
ヘルプを表示 |
エイリアスはスクリプトファイルでは使わない方が推奨されています。
スクリプトの可読性・移植性のために
フルコマンドレット名を使うのがお作法です。
4. ファイル・フォルダ操作
# 現在のディレクトリを表示
Get-Location
# ディレクトリを移動
Set-Location C:\projects
# 一つ上のディレクトリに移動
Set-Location ..
# ファイル・フォルダの一覧を表示
Get-ChildItem
# 隠しファイルも含めて表示
Get-ChildItem -Force
# 特定の拡張子のみ表示
Get-ChildItem -Filter *.py
# サブフォルダも含めて再帰的に表示
Get-ChildItem -Recurse
# フォルダを作成
New-Item -ItemType Directory -Name "myfolder"
# ファイルを作成
New-Item -ItemType File -Name "myfile.txt"
# ファイルをコピー
Copy-Item "source.txt" "destination.txt"
# ファイルを移動
Move-Item "source.txt" "C:\backup\source.txt"
# ファイルを削除
Remove-Item "myfile.txt"
# フォルダを中身ごと削除
Remove-Item "myfolder" -Recurse -Force
Remove-Item -Recurse -Forceは元に戻せません。
削除対象のパスを必ず確認してから実行してください。
5. ファイルの内容操作
# ファイルの内容を表示
Get-Content "myfile.txt"
# 末尾10行を表示
Get-Content "myfile.txt" -Tail 10
# リアルタイムで末尾を監視(Linuxのtail -fに相当)
Get-Content "myfile.txt" -Wait
# ファイルに書き込む(上書き)
"Hello, World!" | Out-File "myfile.txt"
# ファイルに追記する
"追加行" | Out-File "myfile.txt" -Append
# 文字コードを指定して書き込む
"テスト" | Out-File "myfile.txt" -Encoding UTF8
# ファイルの内容を変数に格納
$content = Get-Content "myfile.txt"
6. 変数
# 変数の定義($から始まる)
$name = "PowerShell"
$number = 42
$flag = $true # 真偽値は$true / $false
# 変数を表示
Write-Host $name
Write-Host "Hello, $name" # 文字列内に埋め込める
# 変数の型を確認
$name.GetType()
# 配列
$array = @("apple", "banana", "cherry")
$array[0] # apple
# ハッシュテーブル(連想配列)
$hash = @{
Name = "PowerShell"
Version = "7.x"
}
$hash["Name"] # PowerShell
$hash.Name # PowerShell(ドットでもアクセス可能)
7. パイプライン
PowerShellのパイプはオブジェクトを渡します。
# プロセス一覧をソートして表示
Get-Process | Sort-Object CPU -Descending
# 特定のプロセスを検索
Get-Process | Where-Object { $_.Name -like "*chrome*" }
# プロセス名だけ取り出す
Get-Process | Select-Object Name, CPU
# 先頭5件だけ取得
Get-Process | Select-Object -First 5
# 件数をカウントする
Get-ChildItem | Measure-Object
# CSVに出力する
Get-Process | Export-Csv "process.csv" -NoTypeInformation
$_はパイプラインで渡ってきたオブジェクト(現在の要素)を指します。
Where-ObjectやForEach-Objectの中でよく使います。
8. 条件分岐とループ
# if文
$value = 10
if ($value -gt 5) {
Write-Host "5より大きい"
} elseif ($value -eq 5) {
Write-Host "5と等しい"
} else {
Write-Host "5より小さい"
}
# 比較演算子一覧
# -eq 等しい
# -ne 等しくない
# -gt より大きい
# -lt より小さい
# -ge 以上
# -le 以下
# -like ワイルドカード一致
# -match 正規表現一致
# forループ
for ($i = 0; $i -lt 5; $i++) {
Write-Host $i
}
# foreachループ
$items = @("apple", "banana", "cherry")
foreach ($item in $items) {
Write-Host $item
}
# ForEach-Object(パイプラインで使う)
1..5 | ForEach-Object { Write-Host $_ }
# whileループ
$count = 0
while ($count -lt 3) {
Write-Host $count
$count++
}
9. 文字列操作
$str = "Hello, PowerShell"
# 文字列の長さ
$str.Length
# 大文字・小文字変換
$str.ToUpper()
$str.ToLower()
# 特定の文字列を含むか確認
$str.Contains("PowerShell") # True
# 文字列を置換
$str.Replace("PowerShell", "World")
# 文字列を分割
$str.Split(",")
# トリム(前後の空白を削除)
" Hello ".Trim()
# 部分文字列を取得
$str.Substring(0, 5) # Hello
# 文字列の検索
$str.IndexOf("PowerShell") # 7
10. プロセス・サービスの管理
# プロセス一覧を表示
Get-Process
# 特定のプロセスを表示
Get-Process -Name "notepad"
# プロセスを起動
Start-Process "notepad.exe"
# プロセスを強制終了
Stop-Process -Name "notepad" -Force
# サービス一覧を表示
Get-Service
# サービスの状態を確認
Get-Service -Name "wuauserv"
# サービスを起動・停止・再起動
Start-Service -Name "wuauserv"
Stop-Service -Name "wuauserv"
Restart-Service -Name "wuauserv"
11. よく使う便利なコマンド
# クリップボードにコピー
Get-Process | Set-Clipboard
# クリップボードから貼り付け
Get-Clipboard
# コマンドの実行時間を計測
Measure-Command { Get-ChildItem -Recurse }
# コマンドのヘルプを表示
Get-Help Get-ChildItem
Get-Help Get-ChildItem -Examples # 使用例を表示
# コマンドの一覧を検索
Get-Command *process*
# オブジェクトのプロパティ一覧を確認
Get-Process | Get-Member
# 環境変数を確認
$env:PATH
$env:USERNAME
$env:COMPUTERNAME
# 環境変数を設定(セッション内のみ)
$env:MY_VAR = "myvalue"
12. スクリプトファイルのお作法
実行ポリシーの確認と変更
# 現在の実行ポリシーを確認
Get-ExecutionPolicy
# 実行ポリシーを変更(管理者権限が必要)
Set-ExecutionPolicy RemoteSigned
実行ポリシーの種類
| ポリシー | 内容 |
|---|---|
Restricted |
スクリプトの実行を禁止(デフォルト) |
RemoteSigned |
ローカルのスクリプトは実行可。ダウンロードしたものは署名が必要 |
Unrestricted |
すべてのスクリプトを実行可 |
Bypass |
警告なしですべて実行可 |
UnrestrictedやBypassはセキュリティリスクがあります。
通常はRemoteSignedを使用してください。
スクリプトファイルの基本構造
<#
.SYNOPSIS
スクリプトの概要
.DESCRIPTION
スクリプトの詳細な説明
.PARAMETER Name
パラメータの説明
#>
param (
[string]$Name = "World", # デフォルト値あり
[int]$Count = 1
)
# 処理
for ($i = 0; $i -lt $Count; $i++) {
Write-Host "Hello, $Name!"
}
スクリプトのお作法まとめ
| 項目 | 推奨 | 理由 |
|---|---|---|
| コマンド名 | フルコマンドレット名を使う | 可読性・移植性のため |
| 変数名 |
$PascalCaseまたは$camelCase
|
PowerShellの慣例 |
| コメント |
# で記述 |
単行コメント |
| 複数行コメント |
<# 〜 #> で囲む |
ブロックコメント |
| エラー処理 |
try-catchを使う |
例外を適切に処理する |
| 出力 |
Write-HostよりWrite-Outputを推奨 |
パイプラインに渡せる |
13. エラーハンドリング
try {
# エラーが発生する可能性のある処理
Get-Content "存在しないファイル.txt" -ErrorAction Stop
}
catch {
# エラー発生時の処理
Write-Host "エラーが発生しました: $($_.Exception.Message)"
}
finally {
# 必ず実行される処理
Write-Host "処理終了"
}
-ErrorAction Stopについて:
PowerShellのエラーはデフォルトでは処理を継続します。
-ErrorAction Stopを付けることで
エラーをcatchで捕捉できるようになります。
まとめ
| カテゴリ | 主なコマンド |
|---|---|
| ファイル操作 |
Get-ChildItem / New-Item / Remove-Item
|
| ファイル内容 |
Get-Content / Out-File
|
| 変数 | $変数名 = 値 |
| パイプライン |
Where-Object / Select-Object / ForEach-Object
|
| プロセス |
Get-Process / Start-Process / Stop-Process
|
| サービス |
Get-Service / Start-Service / Stop-Service
|
| ヘルプ | Get-Help コマンド名 |
| エラー処理 | try-catch-finally |
さいごに
コマンド操作には慣れるまで時間がかかりますが
慣れたら普段づかい以外にも
バッチ処理にも使えて便利です。