仕事でpowershellを使って何かをすることが多いのだけど、いかんせんコマンドが覚えられない・・・ので、自分用のとりあえずメモを作成します。
基本的に簡単なコマンド類しか書かないつもりです。スクリプト化したものは別エントリにて紹介したい。。。と思ってます。
とりあえずメモ 目次
とりあえず書き連ねていって、ひとつの項目がある程度のボリュームになったら一つのエントリとしてアップし直したいです。
- PowerShellバージョン確認
- ネットワークカテゴリの確認と切り替え
- 改行
- 置換
- スクリプトに引数を付与
- スクリプトの引数チェック
- Whileループ
- if ~終了コード確認~
- 区切り文字を指定して文字列を分ける
- 行頭の空白を削除
- PATHが存在すれば削除
- PATHが存在しなければフォルダを作成
- 行頭に#がある行を除外する
- ファイルに記載された値の合計値を算出
- 出力を捨てる
とりあえずメモ 詳細
PowerShellのバージョン確認
1 2 3 4 5 6 7 8 9 10 11 12 |
> $PSVersionTable Name Value ---- ----- PSVersion 5.1.14393.1358 PSEdition Desktop PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.14393.1358 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 |
ほんとにただPowerShellバージョンだけ知りたければ以下。
1 2 3 4 5 |
> $PSVersionTable.PSVersion Major Minor Build Revision ----- ----- ----- -------- 5 1 14393 1358 |
ネットワークカテゴリの確認と切り替え
ネットワークのカテゴリとは、パブリックネットワークとかプライベートネットワークとかいわれるやつ。ドメイン環境なのであれば、ドメインネットワークですね。
まずは確認は以下。
1 2 3 4 5 6 7 8 |
> get-NetConnectionProfile Name : ネットワーク 8 InterfaceAlias : イーサネット InterfaceIndex : 21 NetworkCategory : Public IPv4Connectivity : Internet IPv6Connectivity : NoTraffic |
ほんとにただネットワークカテゴリだけ知りたければ以下。
1 2 3 4 5 |
> get-NetConnectionProfile | Select-Object NetworkCategory NetworkCategory --------------- Public |
切り替えは以下。-Name は、get-NetConnectionProfile で表示されるName。
1 |
Set-NetConnectionProfile -Name "ネットワーク名" -NetworkCategory Private または Public または DomainAuthenticated |
改行
Get-Content で改行するしないについて。ヒアドキュメントを使うと簡単に表すことができる。
1 2 3 4 5 6 7 8 9 10 |
$Body = @" hoge foo bar "@ echo $Body hoge foo bar |
置換
文字列を置換したいとき。書き方としては以下。
1 2 3 4 5 |
# 構文 $hoge = 置換文字列 -replace "置換前","置換後" # 行末の空白を削除 $hoge = $foo -replace "\s$","" |
以下では、¥を_に置換後、:を削除している。
1 2 3 4 5 6 |
> $hoge1 = "C:\foo\bar" > $hoge = $hoge1 -replace "\\","_" > $hoge = $hoge -replace ":","" > echo $hoge C_foo_bar |
1 2 |
> .\replace.ps1 C_foo_bar |
スクリプトに引数を付与
1 2 |
echo $Args[0] echo $Args[1] |
1 2 3 |
> .\args.ps1 hoge foo hoge foo |
スクリプトの引数チェック
Length で引数の個数を確認できます。
必要な引数の個数と合致しなければ、メッセージを出して exit します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$Basename = $MyInvocation.MyCommand.Name if ($Args.length -ne 2) { Write-Output "" Write-Output "Error : 引数に以下を指定してください。" Write-Output " :" Write-Output " : 1.XXXXX" Write-Output " : 2.yyyyy" Write-Output "" Write-Output "Usage : .\$Basename xxxxx yyyyy" Write-Output "" exit 1 } |
while ループ1
linuxでも同じ書き方です。6より小さければ $Count +1→ループ。
1 2 3 4 5 6 7 |
$Count=1 while ($Count -lt 6) { write-host $Count $Count++ } |
while ループ2
$Count が5よりおおきくなったらループ抜ける。それ以外(4まで)は$Count +1→ループ。
1 2 3 4 5 6 7 8 9 10 |
$Count=1 while ($True) { if ($Count -gt 5) { break } write-host $Count $Count++ } |
if ~終了コードの確認~
イメージし易いように、前の処理が正常終了した場合はサーバを再起動する、異常終了したら exitコード1でexitする、という動き。
1 2 3 4 5 6 7 8 9 10 11 |
if ($? -eq $True) { echo "コンピュータを再起動します" Restart-Computer }else{ echo "エラーにより中断します" exit 1 } |
区切り文字を指定して文字列を分ける
Linuxでいうawk + print みたいな使い方です。
「:」をデリミタ(区切り文字)にして、2つ目をとる。0スタートなので、2つ目を取得したければ1を指定する。
1 2 |
> echo "hoge1:hoge2" | ForEach-Object { $( $_ -split ":" )[1] } hoge2 |
デリミタとする文字が複数存在する場合、最初のデリミタ(以下の例では「:」)で2つに区切り2つ目を取得する。
1 2 |
> echo "hoge1:hoge2:hoge3" | ForEach-Object { $( $_ -split ":" , 2 )[1] } hoge2:hoge3 |
行頭の空白を削除
1 2 3 4 5 6 7 8 9 10 11 12 |
# 空白が残ってしまう > echo " hoge" hoge # 行頭の空白を削除 > (echo " hoge").trimstart() hoge # 変数にいれたほうがわかりやすいですね > $i=echo " hoge" > $i.TrimStart() hoge |
PATHが存在すれば削除
1 2 3 |
if ( test-path .\tmpDir ) { Remove-Item .\tmpDir -Recurse -Force > $null } |
PATHが存在しなければフォルダを作成
1 2 3 |
if (!(test-path .\tmpDir)) { New-Item .\tmpDir -ItemType Directory > $null } |
行頭に#がついている行を除外する
Select-Stringのオプションの話になってしまうのですが、、、
使い方の想定としては、なにかの処理をする対象の一覧(patch_list.txt)があって、その中で、対象外にしたいものがある場合に、#を行頭につけて除外できるようにする、というイメージをしています。
1 2 3 4 5 6 7 8 9 10 11 |
> Get-Content .\patch_list.txt HOGE-LB01 HOGE-WEB01 # HOGE-WEB02 HOGE-DB01 > Get-Content .\patch_list.txt | Select-String "^#" -NotMatch HOGE-LB01 HOGE-WEB01 HOGE-DB01 |
例えば、こんな使い方。
1 2 3 4 5 6 7 |
PS > $i = Get-Content .\patch_list.txt | Select-String "^#" -NotMatch PS > foreach ( $target in $i ) { >> echo "$target : hogehoge" >> } HOGE-LB01 : hogehoge HOGE-WEB01 : hogehoge HOGE-DB01 : hogehoge |
ファイルに記載された値の合計値を算出
型を指定しないと文字列として扱われてしまうので、intを指定する。
1 2 3 4 5 6 7 8 |
PS > cat .\data.txt 100 100 100 PS > cat .\data.txt | foreach { $sum += [int]$_ } PS > $sum 300 |
出力を捨てる
Out-Null でよいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
### 捨てない場合 PS > New-Item -Type Directory test1 ディレクトリ: D:\ Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2022/02/15 21:56 test1 ### 捨てる場合 PS > New-Item -Type Directory test | Out-Null PS > PS > New-Item -Type Directory test > $null PS > |
以上です。
↓↓↓ 持っていると便利な一冊。