starzware

ITスキル

PowerShell

TIPS
コマンド
コマンド 説明
Write-Output コンソール(またはPowerShell ISE)に出力
Set-Location ディレクトリのパスを指定し、ディレクトリを移動する
New-Item ファイル、フォルダの新規作成[Alias]ni
Remove-Item 削除(del,rm,rmdirに似た機能)、レジストリ削除
Get-Content ファイル内容(テキスト)を表示(type,catに似た機能)
Invoke-Item 色々実行(フォルダを開く、関連づけて開く、実行ファイル実行...)
Select-String ファイルから文字列を検索する(findstr,grepに似た機能)
Get-ChildItem ディレクトリ情報を取得
Test-Path パスのすべての要素が存在するかどうかを確認
Get-Counter システムのパフォーマンスを計測
Get-EventLog Windows のイベントログを取得
Write-EventLog Windows のイベントをログに記録
New-EventLog 新しいイベントソースを作成
ConvertTo-Json オブジェクトを JSON 形式の文字列に変換
ConvertTo-Xml オブジェクトの XML ベースの表現を作成
Compress-Archive ZIP圧縮
Expand-Archive ZIP解凍
New-Object Microsoft .NET Framework または COM オブジェクトのインスタンスを作成
VBScriptで言えばCreateObject
Get-NetAdapter コンピュータのネットアダプタを取得する
New-NetIPAddress ネットアダプタに静的IPアドレスを設定する
Get-NetTCPConnection TCPポートのコネクションを確認する
Test-NetConnection ネットワークの疎通を確認する
Get-NetIPConfiiguration ネットワークアダプタのIP設定を取得する
New-NetRoute ネットワークの経路を設定する
Get-DNSClientCashe リゾルバキャッシュを取得する
Get-NetNeighbor ネットワークアダプタのARPテーブルを取得
Get-NetConnectionProfile ネットワーク状態を取得する
Get-NetAdpterAdvancedProperty ネットワークアダプターの詳細設定を取得する
Start-Process
CheckPoint-VM [Hyper-V]チェックポイントを作成する
スクリプト実行設定

# ローカルで作成されたスクリプトは無条件で実行できるが、ネットワークから入手したスクリプトは署名が無ければ実行できない
Set-ExecutionPolicy RemoteSigned

# batで起動する例
powershell -NoProfile -ExecutionPolicy Bypass hogehoge.ps1
# batで起動する例2
powershell -ExecutionPolicy RemoteSigned コマンド
スクリプトの文字コード

SJIS、BOM付きUTF-8、UTF-16
エスケープシーケンス

エスケープシーケンス
バッククォート(`)を使用する
タブ `t
改行 `r `n
ダブルクォーテーション `"
引数

# ./hogehoge.ps1 -filename xxxx -count xxx を定義(countはデフォルト=100)
param (
  [string]$filename,
  [int]$count = 100
)
自動変数
自動変数 説明
$true true
$false false
$null NULL
$$ 最後に実行したステートメント
$? 最後に実行したステートメントの結果
$PSScriptRoot スクリプト自身のパスを表す
$IsWindows 環境がWindowsか
IsLinux 環境がLinuxか
IsMacOS 環境がMacOSか
出力(Write-Output)

### 単にコンソールに出力するならWrite-Hostでよい。
# コンソール(またはPowerShell ISE)に出力
Write-Output "Hello World in PowerShell!" | Out-Host
# デフォルトに出力
Write-Output "Hello World in PowerShell!" | Out-Default
# 最後に出力された先かデフォルトに出力
Write-Output "Hello World in PowerShell!"

Out-File, Out-GridView,Out-Null,Out-Printer,Out-String
Excel

$excel = New-Object -ComObject Excel.Application
$book = $excel.Workbooks.Open("C:\hogehoge.xlsx")

# シートの取得
$sheet = $book.Worksheets.Item("Sheet1")

# セル値の取得
$cell_value = $sheet.Cells.Item(1, 2).Value()
$cell_value = $sheet.Range("B2").Value()
# セル数式の取得
$cell_formula_value = $sheet.Cells.Item(1, 2).Formula()
$cell_formula_value = $sheet.Range("B2").Formula()

# 使用している行数
$sheet.UsedRange.Rows.Count
# 使用している列数
$sheet.UsedRange.Columns.Count

# セルに値を設定
$sheet.Cells.Item(1, 2).Value() = $cell_value

# シートループ
foreach ( $sheet2 in $excel.Worksheets ) {
  $sheetname = $sheet2.Name
}

# テキストボックス(オートシェイプ)からテキストを取得
for ($idx=1; $idx -le $sheet.Shapes.Count; $idx++){
  # Shapes("名称")でも取得できるはず
  $text = $sheet.Shapes($idx).TextFrame().Characters().Text
}
# テキストボックスを追加
$sheet.Shapes.AddTextbox(1(msoTextOrientationHorizontal), left, top, width, height).TextFrame().Characters().Text = "テキストボックスに表示"

# 上書きセーブ
[void]$book.Save()
# Bookをとじる
[void]$book.Close($false)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
# Excelの終了
[void]$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
ZIP圧縮

# 圧縮
Compress-Archive -Path 圧縮する対象 -DestinationPath ZIPファイル
パス結合とフルパス

# パス結合 セパレータは自動判別で付与される
$allPath = Join-Path "C:¥" "hogehoge" "filename.ext"
"C:¥hogehoge¥filename.ext"
# フルパス
$path = ".¥filename.ext"
$fullPath = Convert-Path $path
親フォルダを取得する

Split-Path -Path $path
ファイル名取得(.NET版)

$path = "root/path/file.ext"
$filename = [System.IO.Path]::GetFileName($path)
POST

Invoke-RestMethod -Method Post -Uri http://localhost:8080/aaaa -Headers @{'xxx' = 'xxx'} -Body '{"xxx":"xxx"}'
インポート

# スクリプト自身と同じフォルダのenv.ps1を読み込む
. "$PSScriptRoot\env.ps1"
JSONから読み込む

# JSONから設定を読み込む
# ファイル内容 { "hostname": "pc-hogehoge" }
# JSONのキー名に-(ハイフン)は使用しない(コマンドレットとして誤認識するから)
$config = ConvertFrom-Json -InputObject (Get-Content $ConfigFilePath -Raw)
$hostName = $config.hostname
テキストファイル読み書き

$str = "hogehoge"
# 書き込み
Set-Content test.txt $str
# 追記
Add-Content test.txt "追記"
# 読み込み
$read_str = Get-Content test.txt 
# 文字コード指定で出力
Set-Content test.txt $str -encoding UTF8 # UTF-8で書き込み
基本文法

# コメント
# if
if ($a -eq 5) {
} elseif($a -gt 5) {
} else {
}
# for
for ($i = 0 ; $i -le 10 ; $i++) {
}
# foreach
$a = @("A", "B", "C") 
foreach ($item in $a) {
}
Hyper-Vコマンド

# HYPER-V のコマンドの一覧を返す
Get-Command -Module hyper-v | Out-GridView
# 仮想マシンの一覧を返す
Get-VM
# 動作中の仮想マシンの一覧
Get-VM | where {$_.State -eq 'Running'}
# 停止の仮想マシンの一覧
Get-VM | where {$_.State -eq 'Off'}
# 起動
Start-VM -Name (仮想マシン名)
# 動作中の仮想マシンを停止する
Get-VM | where {$_.State -eq 'Running'} | Stop-VM
# チェックポイントを作成する
Get-VM -Name (仮想マシン名) | Checkpoint-VM -SnapshotName (チェックポイント名)
指定フォルダからファイルリスト取得

# "C:¥hogehoge"フォルダからファイルの一覧を取得する
$folderFileList = Get-ChildItem -Path "C:¥hogehoge" -File
# 取得したファイルの数だけループする
foreach($item in $folderFileList) {
    # ファイル名を表示する
    Write-Host $item.Name # .FullName ならフルパス
}

# "C:¥hogehoge¥"フォルダの"*.txt"の一覧を取得する(Includeを指定する場合でRecurseを指定しない場合はPath指定に*が必要らしい)
$folderFileList = Get-ChildItem -Path "C:¥hogehoge¥*" -Include "*.txt"

# "C:¥hogehoge¥"フォルダとサブフォルダの"*.txt"の一覧を取得する
$folderFileList = Get-ChildItem -Path "C:¥hogehoge¥" -Recurse -Include "*.txt"

環境変数とデスクトップフォルダ

# 環境変数の一覧
Get-ChildItem -Path env:

# デスクトップフォルダを取得1 環境変数から組み立て
$desctopPath = $Env:HOMEDRIVE + $Env:HOMEPATH + "¥Desktop"

# デスクトップフォルダを取得2 System.Environmentから取得
$desctopPath = [System.Environment]::GetFolderPath("Desktop")

# スクリプト自身のパス
$MyInvocation.MyCommand.Path
いろいろ

# 年月日(yyyyMMddHHmmss形式)を取得
$yyyyMMddhhmmss = Get-Date -Format "yyyyMMddHHmmss"

# 式の途中で呼び出す
$filename = "ファイル_" + (Get-Date -Format "yyyyMMdd") + ".txt"
連想配列

# 作成
$hash = @{ "A"="AA"; "B"="BB" }

# 要素の取得
$hash["A"]
$hash.A

# ハッシュのループ
# for($entry in $hash.Keys){}
for($entry in $hash.GetEnumerator()){
  $entry.Key
  $entry.Value
}
Environmentクラス

# System.Environmentクラスの利用
# メンバーの一覧を表示(staticメンバー)
[System.Environment] | Get-Member -Static
# OSバージョンを表示する
[System.Environment]::OSVersion
Mathクラス

# System.Mathクラスの利用
# メンバーの一覧を表示(staticメソッド)
[System.Math] | Get-Member -Static -MemberType Methods
# ルート3を計算する
[System.Math]::Sqrt(9)
WebClient

$webClient = New-Object System.Net.WebClient
$webClient.DownloadString("http://URL/") > url.html
メール送信

# メール送信 非推奨なので注意
Send-MailMessage
終了

# スクリプト終了
exit
xxxxxx

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# デスクトップ
#$desctopPath = [System.Environment]::GetFolderPath("Desktop")

#-------------------
# 処理ルーチン
#-------------------
Function Execute(){
  Param(
    [string]$pExcelFile
  )
  $excel = New-Object -ComObject Excel.Application
  $book = $excel.Workbooks.Open("C:\hogehoge.xlsx")

  # シートループ
  foreach ($sheet in $excel.Worksheets) {
    $sheetname = $sheet.Name
    Write-Host $sheetname
  }
  # Bookをとじる
  [void]$book.Close($false)
  [System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
  # Excelの終了
  [void]$excel.Quit()
  [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)

} #Execute

#-------------------
# 起動ルーチン
#-------------------
Function Main {
  Param(
    [parameter(mandatory=$true)]$param1
  )

  if ((Test-Path $param1) -eq $False){
    Write-Host "ファイルがありません"
    exit
  }

  # 処理起動
  Execute $param1

} #Main

# 起動
Main $Args