PowerShellを実業務で使い始めるときの取っ掛かりになる情報
$profile
-
Powershellのターミナル起動時に自動で$profileから定義情報(エイリアス定義や関数定義)が読み込まれる。
要するにLinuxの.bashrcや.bash_profileと同じようなもの。 -
$profileの実体は
$HOME\Documents\PowerShell\Profile.ps1
に保存される。
詳しくは公式ページ。
$profileの編集
# 最初は$HOME\Documents配下にPowerShellディレクトリがないので自分で作る。
New-Item $HOME\Documents\PowerShell -ItemType Directory
# notepadで開く(最初はファイルがないので新規ファイル扱い)
notepad $profile
# 編集後にファイル名「Profile.ps1」で保存する。
$profileに関数を登録しておく
関数登録の例
# Get-Content = catコマンド
Get-Content $profile
function ls_filename_only() {
foreach($item in Get-Item ./*) {
# Basename = 拡張子抜きの名前
$item.Basename
}
}
関数実行の例
# 登録した関数を実行(拡張子抜きの名前だけを表示)
ls_filename_only
alternatives
alternatives.log
alternatives.log.2
auth
auth.log
auth.log.2
# 実際のファイル
Get-Item ./*
-rw-r--r-- root root 2022/12/05 00:00 0 alternatives.log
-rw-r--r-- root root 2022/12/04 16:45 753 alternatives.log.1
-rw-r--r-- root root 2022/10/26 23:55 4464 alternatives.log.2.gz
-rw-r----- root adm 2022/12/11 15:39 7863 auth.log
-rw-r----- root adm 2022/12/10 23:30 69870 auth.log.1
-rw-r----- root adm 2022/12/03 23:58 3409 auth.log.2.gz
$profileにエイリアスを登録して楽をする。
エイリアス登録の例
Get-Content $profile
# Home配下のファイル一覧
Set-Alias ls_alias Get-Item
# functionをエイリアスとして登録
#(引数のせいでうまくエイリアスにできない場合は、functionで定義してエイリアスに登録する)
function ls_file_name_only() {
# 引数の値はargsで受け取る
foreach($item in Get-Item $args[0]) {
$item.Basename
}
}
Set-Alias ls_name ls_file_name_only
エイリアス実行の例
ls_alias ./*
-rw-r--r-- root root 2022/12/05 00:00 0 alternatives.log
-rw-r--r-- root root 2022/12/04 16:45 753 alternatives.log.1
-rw-r--r-- root root 2022/10/26 23:55 4464 alternatives.log.2.gz
-rw-r----- root adm 2022/12/11 15:39 7863 auth.log
-rw-r----- root adm 2022/12/10 23:30 69870 auth.log.1
-rw-r----- root adm 2022/12/03 23:58 3409 auth.log.2.gz
ls_name ./*
alternatives
alternatives.log
alternatives.log.2
auth
auth.log
auth.log.2
作業用にスクリプトファイルをつくる
よく使う命令・構文
ファイル・ディレクトリ一覧を取得
Get-Item ファイルパス
ファイルの内容を表示する
Get-Content ファイルパス [-Encoding <ENcoding>] # Encoding以外のオプションもある
headと同じ働きをする命令
Get-Contentのオプション指定
# $profileの先頭6行
Get-Content $profile -head 6
[始まり..終わり] で指定
# $profileの先頭6行
$(Get-Content $profile)[0..5]
tailと同じ働きをする命令
Get-Contentのオプション指定
# $profileの末尾6行
Get-Content $profile -tail 6
[始まり..終わり] で指定
# $profileの末尾6行
$(Get-Content $profile)[-6..-1]
tailコマンドのファイル監視と同等の挙動をさせる
# -waitオプションを使う
Get-Content $profile -wait
ループ処理
- ファイル1件ずつ処理する場合
- ファイル情報ののプロパティは 公式ページ参照。
foreach($item in Get-Item ファイルパス) {
$item.Name #ファイル名を使う
$item.Basename # 拡張子抜きの名前を使う
}
コマンド実行
# PowerShellのコマンドを実行
Invoke-Command …
# 別プロセスを実行
Start-Process …
配列を利用した繰り返し処理
# @()で配列を定義
$test_array = @('a', 'b', …)
foreach($item in $test_array) {
Write-Host $item
}
Mapを利用した繰り返し処理
# @{}でMapを定義
$test_map = @{
"key" = "value",
…
}
foreach($entry in $test_map.GetEnumerator()) {
Write-Host $entry.Key;
Write-Host $entry.Value;
}
Excelの読み書き(ActiveX)
# Excel(ActiveX)を変数化
$excel = New-Object -ComObject Excel.Application
$book = $null
try{
# 不可視にしておく
$excel.Visible = $false
$excel.DisplayAlerts = $false
# Book Open
$book = $excel.Workbooks.Open(ファイルパス)
# シート取得
$sheet = $book.Sheets(1)
# セルへ値書き込み
$sheet.Cells.Item(x, y) = 値
# セル値の取得
Write-Host $sheet.Cells.Item(x, y)
Write-Host $sheet.Cells.Item(x, y).Text # 文字列として取得
Write-Host $sheet.Cells.Item(x, y).Value() #値を取得
# Excel Book 保存
[void]$book.Save()
} finally {
try{
if($book -ne $null) {
# 利用したExcel Bookオブジェクトの開放
[void]$book.Close($false)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
}
# Excelオブジェクトの開放
[void]$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
}catch{
}
}
CSVファイルの読み書き
# CSV文字列をCSVオブジェクトに変換
$CSVオブジェクト = CSV文字列 | ConvertFrom-Csv
# CSVオブジェクトをCSV文字列に変換
$CSV文字列 = CSVオブジェクト | ConvertTo-Csv
# オブジェクトを一連のコンマ区切り値 (CSV) 文字列に変換し、文字列をファイルに保存
CSVオブジェクト | Export-Csv -Path 保存先ファイルパス
#コンマ区切り値 (CSV) ファイル内の項目からテーブルのようなカスタム オブジェクトを作成
$CSVオブジェクト変数 = Import-Csv -Path CSVファイルパス
jsonファイルの読み書き
# JSON文字列をJSONオブジェクトに変換(PSObject または Hashtableオブジェクト)
$JSONオブジェクト = JSON文字列 | ConvertFrom-Json
# JSONオブジェクトをJSON文字列に変換
$JSON文字列 = JSONオブジェクト | ConvertTo-Json
xmlの読み書き
# .NETオブジェクトをXML表現に変換
$XML = $PSObject | ConvertTo-XML