Translate

2024年2月10日土曜日

PowerShellメモ

■PowerShell ISE
PowerShellスクリプト開発環境のことデバッグ機能、入力支援機能あり

■変数作成
宣言はなし。値代入により変数が作成される。

$ + 変数名 で作成できる。

$str = "あいうえお" 
$int = 10 
 ※大文字小文字は識別されない 

■標準出力
Write-Host 変数名 で出力 

■strictモード
以下のようにタイプミスしても何も表示されない
$string = "Hello World!"
Write-Host $sting

そのため set-psdebug -Strict を記載すると
それ以降で、変数が作成されていないのに利用しているとエラーとなる

set-psdebug -Strict $string = "Hello World!"
Write-Host $sting

>変数 '$sting' は、設定されていないために取得できません。

■変数の型
// 整数
Byte (8bit 符号なし) 
Char (16bit 符号なし) 
UInt16(16bit 符号なし) 
UInt32(32bit 符号なし) 
UInt64(64bit 符号なし) 
 SByte (8bit 符号あり) 
Int16 (16bit 符号あり) 
Int32 (32bit 符号あり) 
Int64 (64bit 符号あり) 

 // 他
Decimal 
Double 
Boolean 
DateTime 
String 
Object 

代入した際に型が自動的に決まってしまうので、数値については 
下記のように型を記載することで指定できる

[Byte]$num = 255
参考:
以下によって変数の型が取得できる
set-psdebug -Strict
$str = "文字列"
Write-Host $str.GetType()

■型変換
変数 -as データ型 で変換できる

$numstr = "123"
$num = $numstr -as [Int16]


■文字列中の変数展開
set-psdebug -Strict
$num = 123

Write-Host "`$numの値は、 $num です"
Write-Host "`$numの値は、${num}です"

半角スペースで区切れている場合は、よいが区切れていないと変数名の切れ目が意図したところにならないので{}で囲む
また、$自体をエスケープするには `(バックくぉーと)を使う
カレントフォルダで Name列が sで始まるデータに絞り込み全列表示


■定数
Set-Variable -name keisu -value 0.5 -option constant
$keisu = 0.6

>変数 keisu は読み取り専用または定数であるため、上書きできません。


■特別な変数
$Args…引数が格納されている

$True…True
$False…False
$NULL…Null

$This…オブジェクト自身

$Error…エラー


■配列の初期値
①コンマ区切りで指定する
$dataList = "aaa", "bbb", "ccc"
Write-Host $dataList #aaa bbb ccc

$dataList = 100, 200, 300
Write-Host $dataList

$dataList = 3..5 #連続する数値を配列に指定
Write-Host $dataList.Count #3

②@()を使う
$dataList = (100, 200, 300)
Write-Host $dataList #100 200 300


■配列の初期値(1要素の配列)
①@()を使う
$dataList = @(100)
Write-Host $dataList[0]

②,とデータを指定する
$dataList = ,100
Write-Host $dataList[0] #100

■要素を追加
$dataList = @("aaa", "bbb", "ccc")
$dataList += ("ddd")
Write-Host $dataList #aaa bbb ccc ddd
※System.String[]では、Addではなく += で追加


■要素を削除
削除したい要素以外のデータで配列を作り直す
$dataList = @("aaa", "bbb", "ccc", "ddd", "eee")
$dataList = $dataList[0..2] + $dataList[4]
Write-Host $dataList #aaa bbb ccc eee

■配列の個数
$変数名.length … 個数 #Countを同じ

■多次元配列
$data = New-Object 'string[,]' 2,3
$data[0,0] = "0,0"
$data[0,1] = "0,1"
$data[0,2] = "0,2"

$data[1,0] = "1,0"
$data[1,1] = "1,1"
$data[1,2] = "1,2"

Write-Host $data #0,0 0,1 0,2 1,0 1,1 1,2


■ジャグ配列
$data = @(@(11, 12), @(21, 22, 23))
Write-Host $data #11 12 21 22 23



■算術演算子
+-*/%

■比較演算子
-eq …等しい
-ne …等しくない

-gt …より大きい
-ge …以上
-lt …より小さい
-le …以下

-like …ワイルドカードに一致
-notlike …ワイルドカードに不一致
※ *…以上にマッチ ?…1文字にマッチ

-match …正規表現に一致
-notmatch …正規表現に不一致

・文字、小文字の比較
Write-Host ("abc" -ceq "ABC") #大文字小文字区別
Write-Host ("abc" -ieq "ABC") #大文字小文字区別しない
Write-Host ("abc" -eq "ABC")  #デフォルトは大文字小文字区別しない

■論理演算子
-and
-or
-not
-!

■if文
if(条件){
}elseif(条件){
}else{
}

■switch
switch 条件
{
  値1{}
  値2{}
  …
  default{}
}
※途中で抜けたいときは、break

■for文
for($i = 0; $i -lt 10; $i++)
{
    if($i % 2 -eq 0) { continue }
    if($i -eq 9) { break }
    Write-Host $i  #1 3 5 7  
}

■foreach
foreach($num in $numList){
    write-host $num
}


■while
while(条件){}

■コメント
# 1行コメント

<#
複数行
コメント
#>

■改行、タブ
バッククォートをつける
`n
`t

■関数
--------------------------------------------
Echo("test")

function Echo($message){
    Write-Host $message
}
--------------------------------------------
#引数の型を定義することも可
function Echo([string]$message){
    Write-Host $message
}
--------------------------------------------
2つの値を足して、結果を返す場合
function Plus([int]$num1, [int]$num2){ 
    return $num1 + $num2
}

$ans = Plus 10 20
Write-Host $ans

※関数に渡した際の型がよくわからない・・・
後で調べる
※参照渡しの場合は、呼び出す側、仮引数ともに[ref]をつける

■例外
try{
    throw "エラーのテスト"
}
catch
{
    Write-Host "catch $_"
}
finally
{
    Write-Host "finally"
}


■他後でまとめる
Get-ChildItem | Where-Object { $_.Name -Match "^s"}


カレントフォルダで Size列
Get-ChildItem | Where-Object { $_.Name -Match "^s"} | Select-Object Name

カレントフォルダ配下すべてに対し、 *.xml に絞り、更新日時でソートし、ファイル名の古パスを1件表示
Get-ChildItem -Filter *.xml -Recurse  | Sort-Object LastWriteTime -Descending |  Select-Object {$_.FullName} -first 1</div>