LoginSignup
3
10

More than 5 years have passed since last update.

Powershell 逆引き

Last updated at Posted at 2017-09-12

Powershell 逆引き

演算子・文字列

 シェルというだけあって書き方がシェルと同じように書ける。

「または」「かつ」(論理演算子)

  • "-or" "and"で書ける1
実行例
PS C:\Users> $a = 1
PS C:\Users> $b = (2 -gt $a) -and ($a -gt 0)
PS C:\Users> $b
True

「より大きい」「より小さい」「同じ」「異なる」(比較演算子)

  • "-gt" "-lt" "-eq" "-ne" で書ける。2

特殊文字

意味 エスケープシーケンス
タブ `t
改行(CRLF) `r`n

配列に比較演算子を使うとtrueのもののみの配列を返すフィルターとして動作

 コメント欄で教えていただいて、便利だったのでメモ。3

配列に比較演算子
$a = 1, 2, 3, 4, 5
$b = ($a -gt 2)
Write-Output $b

3
4
5

 ※左辺が配列である必要がある。逆にすると以下エラー

配列に比較演算子でエラー
Could not compare "2" to "1 2 3 4 5". Error: "Cannot convert the "System.Object[]" value of type "System.Object[]" to type "System.Int32"."
At line:3 char:1
+ $b = 2 -gt $a
+ ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : ComparisonFailure

データ

型変換4

  • 右辺の最初のデータ型に自動的に変換される
  • [string][int]などで意図的に変換も可能

文字列の連結

  • 配列に格納された文字列 → System.String クラスの Join メソッドを使用
  • 文字列の連結には【+】記号【+=】演算子を利用
  • 文字列の繰り返しには【*=】演算子を利用
*=の例
PS C:\Users> $a = "hoge"
PS C:\Users> $a *= 3
PS C:\Users> $a
hogehogehoge

日付取得と書式変更

 Get-Dateで日付取得し、ToStringで書式を変更。5

日付取得の例
PS C:\Users> (Get-Date).Tostring("yyyy/MM/dd HH:mm:ss")
2017/09/12 17:07:15

入力

引数

 paramを使うことで引数を変数に流し込める。
 $args.length で引数の個数を。

引数取得・個数チェック例
PS C:\Users> cat .\paramTest.ps1
param($aaa, $bbb)
Write-Output $aaa
Write-Output $bbb
Write-Output $args.length
PS C:\Users> .\paramTest.ps1 hoge fuga
hoge
fuga
0

 paramは先頭に書かないと次のエラーが出る。

paramのエラー例
PS C:\Users> cat .\paramTest.ps1
Write-Output $aaa
param($aaa, $bbb)
Write-Output $aaa
PS C:\Users> .\paramTest.ps1 hoge fuga
param : The term 'param' is not recognized as the name of a cmdlet, function, script file, or operable program. Check t
he spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\UsersparamTest.ps1:2 char:1
+ param($aaa, $bbb)
+ ~~~~~
    + CategoryInfo          : ObjectNotFound: (param:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

出力

文字列出力

 以下のような出力方法がある6

  • "と'
  • Write-* Cmdlet
  • $Host.UI
  • .NET Framework

リダイレクト

 リダイレクトが可能なので、ログファイルを作りやすい。
 リダイレクトのオプションについてはマニュアルが分かりやすい。忘れそうなものについて抜粋7

演算子 リダイレクト内容
2> エラーメッセージをリダイレクト
*>> 全ての出力を追記リダイレクト

制御

分岐(if)・ループ(for/while)あれこれ

簡単に構文を

 他の言語とごっちゃになるので、括弧の配置だけ簡単に。

  • if() {} elseif() {} else {}
  • for(;;) {}
  • while() {}
  • do while() {}

変数の初期値判定

 変数の前に[bool]をつけることで、変数の初期値判定結果値を返す。
 よって、変数をif文などの条件式に入れることで、「変数が初期値かどうか」の判定が可能。
 String型であれば「""かどうか」の判定に使える

変数に値が入っているかどうかの判定例
$server = ""
if (!$server) {
    Write-Output "サーバー名を引数に入れてください"
    exit
}

コマンド実行間隔を調整したい

  • Start-Sleep(sleep)を利用8
Sleepの実行例
PS C:\Users> Start-Sleep 10 #10秒停止
PS C:\Users> Start-Sleep -m 1000   #1000ミリ秒(=10秒)停止

条件分岐・ループ・ジャンプ処理

  • 参考URL9参照
  • swhich文の豊富さは便利
  • きちんとcontinue / break があるのでループからの脱出に悩まなくてよい

DOSのpauseに相当するものは?10

  • Read-Host ”文字列”
  • $host.UI.RawUI.ReadKey() ※何か入力するまで一時停止

関数

関数の再利用

 スクリプトをドットソース形式で使用することで可能。11

ドットソース形式例
. "hoge.ps1"

プロセス・サービス

プロセス停止まで待機

  • Wait-Process を使う12
    • サービス停止まで待機するには、サービスを動かしているプロセスのPIDを取得し、そのプロセスの停止を見る方法もある

サービスの開始・停止・再起動13

Windows OS Versionの取得

[System.Environment]::OSVersion で取れる14

OSLevel取得例

PS C:\> [System.Environment]::OSVersion

Platform ServicePack    Version        VersionString
-------- -----------    -------        -------------
 Win32NT Service Pack 1 6.1.7601.65536 Microsoft Windows NT 6.1.7601 Service Pack 1

PS C:\> [System.Environment]::OSVersion.Version

Major  Minor  Build  Revision
-----  -----  -----  --------
6      1      7601   65536


PS C:\> [System.Environment]::OSVersion.Version.Major
6

実行環境

  • .ps1を他の環境で実行できない
    • ポリシーにより制約がかかっているため、実行ポリシーの変更を(一時的に)行う15
  • タスクスケジューラに登録したPowershellが動かない・一部エラーとなる(手動実行は成功する)
    • タスクの「セキュリティオプション」で「最上位の特権で実行する」のチェックが入っているかどうか確認。16

バージョンの確認方法

 $PSVersionTableで可能。

デバッグについて

 良く使う手法についてはこちら。詳細は参考URLに詳しい。17

  • ISEのソースコード上で、一旦止めたい場所でF9を押すと、一時停止する場所(ブレークポイント)を作成できる
  • 一時停止中、コンソールウィンドウに変数名+Enterで、その時の変数の内容を確認できる
  • 再開はF5

参考URL

3
10
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
10