PowerShellで扱うコマンドの総称。
コマンド、変数等を記述する場合に大文字と小文字を区別しない。例)$aと$Aは同じ変数
実行結果(戻り値)は.NETオブジェクトを返す。
Read-Host $MsgStr #コンソール画面から入力
Write-Host $MsgStr -ForegroundColor green #コンソール画面へ出力(緑色で)
・ヘルプの参照
「Get-Command」「Get-Help」「Get-Member」という3種類のコマンドレットを使ってヘルプを参照できる。
最新ヘルプを入手するには、Windows PowerShell を管理者として実行し、Update-Helpコマンドレットを実行する。
コマンドレット名 -? #コマンドレットのヘルプを表示
Get-Help コマンドレット名 #コマンドレットのヘルプを表示
Get-Help コマンドレット名 -Online #オンライン ヘルプを表示
・パイプライン処理"|"を使用して出力結果を次のコマンドに渡すことができる。。
引き渡す結果は.NETオブジェクトになる。"$_"はパイプ経由で渡されたオブジェクトを表す。
Get-ChildItem | Where-Object {$_.Length -ge 1MB} #取得したファイル一覧から、サイズが1Mbytes以上のものだけを表示
・エイリアスとは
主要なコマンドレットに対してエイリアス(別名)を提供しており、cd、dir、lsコマンドなども使用できる。
また、必要に応じて自分でエイリアスを登録することも可能。
Get-Alias #現在利用可能なエイリアスを確認
Set-Alias remove Remove-Item #エイリアスremove作成
・ドライブとは
PowerShellからアクセス可能なデータ領域のことで、C:\などのファイルシステムの他にレジストリ、変数などのドライブがあり、変更や追加をすることが可能。
また、データベースにアクセスするようなドライブを追加することも可能。
Get-PSDrive #利用可能なドライブを一覧表示
Set-Location "C:\" #カレントのディレクトリを変更
New-PSDrive -Name Office -PSProvider FileSystem -Root "C:\Program Files\Microsoft Office\OFFICE11" #MS Officeのインストール先を登録
Remove-PSDrive -Name Office #ドライブの登録削除
・変数の基本
・命名規則は、先頭文字は"$"で始まり、英数字または"_"であること。大文字、小文字の区別はなし。例)$a_Str
ただし、"${~}"のように、中カッコで変数名を囲めば任意の文字を利用できる。例)${あいうえお}
・変数は、Variableドライブと呼ばれる場所にオブジェクトとして追加されており、Variableコマンドレットで一覧が確認できる。
また、オブジェクトであるため様々なプロパティやメソッドを持っている。
・データ型
通常は、代入データに応じて自動的に適切なデータ型を与えられるため、あらかじめ変数を宣言する必要はない。
データ型を宣言する場合は、前に"[]"で囲んだ型名を追加する。
異なる型どうしで代入または演算する場合はキャスト(変換)を試みる。例)[Int]$a = "10"
[char] System.Char 0~127 0x00~0x7F
[byte] System.Byte 0~255 0x00~0xFF
[uint16] System.UInt16 0~65535 0x0000~0xFFFF
[uint32] System.UInt32 0~4,294,967,295 0x00000000~0xFFFFFFFF
[uint64] System.UInt64 0~18,446,744,073,709,551,615
[sbyte] System.SByte -128~127
[int16] System.Int16 -32768~32767
[int]、[int32] System.Int32 -2,147,483,648~2,147,483,647
[long]、[int64] System.Int64 -9223372036854775808~9223372036854775807
[single、float] System.Single -3.402823E+38~3.402823E+38
[double] System.Double -1.79769313486232E+308~1.79769313486232E+308
[decimal] System.Decimal -79228162514264337593543950335~ 79228162514264337593543950335
[bool] System.Boolean $true、$false
[string] System.String 文字列
[array] System.Array 配列
[xml] System.Xml.XmlDocument
[type] System.Type
[datetime] System.DateTime 0001/01/01 0:00:00~9999/12/31 23:59:59
[timespan] System.TimeSpan -10675199.02:48:05.4775808~10675199.02:48:05.4775807
変数の型を確認するには、$a.GetType()で取得できます。
・PowerShellのコンソールで一度変数を作成してしまうと、PowerShellを終了するまでその変数は残ってしまう。
変数を開放するには、Remove-Variable 変数名 を使用する。
変数の値のみ削除する場合は、$nullを代入する。
・定数
PowerShellの変数では定数を指定することはできない。ただし、-Optionパラメータにて読み取り専用にすることで同様な使い方ができる。
set-Variable 変数名 値 -option ReadOnly 読取専用 ※変数名に"$"は不要
set-Variable 変数名 値 -option constant 削除も禁止 ※変数名に"$"は不要
・自動変数(予約変数)
PowerShell内部で自動的に定義される変数です。これらを別の変数として定義することはできません。
$_ パイプライン経由で渡されたオブジェクト
$^ 入力行の行頭単語
$$ 入力行の行末単語
$? 直前のコマンド実行結果Bool値
$Args 引数リスト
$true 真のBool値
$false 偽のBool値
$Home ホームディレクトリのフルパス
$LastExitCode 直前のコマンドの戻り値
$MyInvocation 実行コマンド自身の情報
$OFS awkでお馴染みの出力時フィールドセパレータ
$psISE ISE環境で実行しているか。ISE時$true
$PID 自身のプロセスID番号
$PsVersionTable PowerShellのバージョン情報
$Pwd ドライブレター込みのカレントディレクトリパス
$PSScriptRoot スクリプトのディレクトリ
$PSCommandPath 実行するスクリプトの完全なパスとファイル名を格納
$Error 最新のエラーを表すエラーオブジェクトの配列。最新は$Error[0]
$null null値または空の値。コマンドとスクリプトで存在しない値または未定義の値を表します。
$input、$foreach、$switch 列挙子。コードブロックによって処理される値で反復処理やイテレーション値の取得に使用されプロパティとメソッドが含まれている。
$foreach.Current 現在のコレクション要素 $foreach.Reset() コレクション全体をリセット $foreach.MoveNext() 次のコレクションを呼び出し
・変数のスコープ
PowerShellではスコープの範囲が独特であり注意が必要です。
子スコープでは、変数を参照する場合は親スコープの値になりますが、値が変更されると子スコープ内の変数として扱われ、親スコープに値が反映されません。
そのため、親スコープに反映させるには、$script:でスコープ範囲を指定します。
変数の先頭にスコープ範囲を指定することで下記の動作となります。
$global: スコープ範囲を無制限にし他のスクリプトからも読み書き可能
$script: スコープ範囲を同一スクリプト内として読み書き可能
$local: 省略時のスコープ。現在スコープでのみ読み書き可能、子スコープでは参照のみ可能。
$private: スコープ範囲を現在のブロック内(”{}”範囲)として読み書き可能
function Add-Str(){ Write-host $Str1 #参照のみの場合は変数は作成されず。値は"abc" $Str1 += "def" #値を変更する場合は新規に変数が作成される。値は"def" $script:Str2 += "def" #スクリプトスコープ指定。値は"abcdef" } $Str1 = "abc" $Str2 = "abc" Add-Str #関数呼び出し Write-host $Str1 #値は"abc" Write-host $Str2 #値は"abcdef" $Str1 = "abc" $Str2 = "abc" . Add-Str #ドットソース形式で呼び出し。関数内の変数はすべてスコープ対象になる。 Write-host $Str1 #値は"abcdef" Write-host $Str2 #値は"abcdef"
Try { #例外監視するブロック Start-Something -Path $path } Catch [System.IO.IOException] { #例外クラスを指定して振り分け Write-Host "IO error with the file: $path" -ForregroundColor Yellow } Catch [System.IO.FileNotFoundException], [System.IO.DirectoryNotFoundException] { #例外クラスを複数指定時はカンマ区切りで指定 Write-Host "Could not find $path" -ForregroundColor Yellow } Catch { #例外がスローされた際の処理 $Error[0] | Out-string | Write-Host -ForegroundColor red } Finally { #例外の有無関係なく、最後に行われる処理 Write-Host "処理が終了しました。" -ForegroundColor green }catchブロック内には、例外の詳細を含む ErrorRecord型の自動変数($PSItem または $_)があります。
$a = 5 / 0 Trap { Write-Host "エラーが発生しました。" #break #エラーメッセージが表示され処理を終了する #continue #エラーエラーメッセージは表示されず、次の処理が実行される }
●タブ補完
コマンド ウィンドウまたはスクリプト ウィンドウでコマンドのいくつかの文字を入力し、Tab キーを押すと、目的の補完テキストを選択できます。
コマンドレット名、パラメーター名、変数名、オブジェクトのプロパティ名、またはファイルのパスを入力する場合に役立ちます。
●コンソール ウィンドウ
順番に実行する複数のコマンドを入力するには、コマンドとコマンドの間 でShift+Enterキー を押す。
コマンドを停止するには、ツール バーで[実行を中止]をクリックするか、または Ctrl+Breakキー を押します。
●スクリプト ウィンドウ
・ファイルの種類は、スクリプト ファイル (.ps1)、スクリプト データ ファイル (.psd1)、スクリプト モジュール ファイル (.psm1) です。
他に構成ファイル (.ps1xml)、XML ファイル、テキスト ファイルがあります。
・スクリプトの一部を実行するには、スクリプトの一部を選択し[ファイル] メニューの [選択項目を実行] 、またはツール バーの [選択項目を実行] をクリックします。
・シュートカットキー
Help (ヘルプ) F1
検索 Ctrl+F 後方検索 F3 前方検索 Shift+F3
検索して置換 Ctrl+H
元に戻す Ctrl+Z
展開折りたたみ Ctrl+M
実行 F5
選択範囲の実行 F8
実行を中止 Ctrl+Break
・別のエンコードでスクリプトを保存するには(デフォルトはUnicode(BigEndianUnicode)として保存)
$psISE.CurrentFile.encoding #現在のファイルのエンコードを取得
$psISE.CurrentFile.SaveAs("MyScript.ps1", [System.Text.Encoding]::ASCII) #MyScript.ps1 という名前の ASCII エンコードで保存
●ブレークポイント
行のブレークポイント、変数のブレークポイント、コマンドのブレークポイントが設定可能。
・操作方法
設定する箇所で右クリック、[デバッグ] メニュー、スクリプト ウィンドウで変数にマウスのカーソルを合わせるなど。
また、コンソール ウィンドウから Set-PSBreakpoint コマンドレットを使うことでも可能。
・シュートカットキー
ステップ イン F11 現在のステートメントを実行。関数やスクリプトにステップ インします。
ステップ オーバー F10 関数やスクリプトの全体を実行し、関数を呼び出した後の次のステートメントで停止
ステップ アウト Shift+F11 関数からステップ アウトし、関数が入れ子になっている場合は 1 つ上のレベルに移動
続行 F5
デバッガーの停止 Shift+F5
呼び出し履歴の表示 Ctrl+Shift+D
ポイント一覧表示 Ctrl+Shift+L
ポイント設定/解除 F9
すべて削除 Ctrl+Shift+F9
・変数の値を表示
スクリプト ウィンドウで、変数にマウスのカーソルを合わせる。
コンソール ウィンドウで、変数名を入力して Enter キーを押す。
ただし、次の自動変数に対しては機能しません。
$_、$Input、$MyInvocation、$PSBoundParameters、$Args
●インストール
監視者権限にてPowerShellを起動し、Install-Module ps2exeを実行します。
「続行するには NuGet プロバイダーが必要です」の警告が表示されたらEnterキーを押します。
「信頼されていないリポジトリ」の警告が表示されたらYを入力してインストールが開始されます。
C:\Program Files\WindowsPowerShell 以下のフォルダにインストールされます。
●使い方
コマンドプロンプトから実行する場合は、下記のコマンドにて同じフォルダに作成されます。
ps2exe .\test.ps1GUIから起動する場合は、下記コマンドを実行します。
win-ps2exeSource file、Target file欄にてファイル名を指定し、Compileボタンを押すとexeファイルが作成されます。
Source file | ps1ファイルを選択する。 |
Target file | 出力するexeファイル名を指定。未入力時はps1ファイルと同名になる。 |
Icon file | exeファイルにアイコンを埋め込む場合は画像を選択する。 |
Compile a・・・ | チェック時:GUI Windowsプログラムとして出力する。(起動時に画面表示されない、標準出力はダイアログで表示する) |
未チェック:PowerShellのDOS窓で起動される。 | |
Suppress output | 標準出力をしない。 |
Suppress error | エラー出力をしない。 |
Require administrator | 管理者権限を必要とする。 |
Gnerate config file | ? |
Thread Apartment Stater | exeファイルがSTA(Single-Threaded Apartment)かMTA(Multithreaded Apartment)かを指定する。 |
Platform | AnyCPU、x64、x86を指定する。 |
If (式) { #処理 } ElseIf (式) { #処理 } Else { #処理 } Switch ($i) { 1 { #処理 Break } 2 { #処理 } 3 { #処理 } Default { #処理 } } Switch のオプション -case 大文字と小文字を区別する。 -Wildcard 条件にワイルドカードが使用できる。 -Regex 正規表現が使用できる。 比較対象にコレクションを指定することも可能。
For ($i = 0; $i -lt 3; $i++) { #条件が満たされている間繰り返す #処理 } Foreach ($a in $ary) { #コレクションを順に代入し繰り返す #処理 } While ($i -lt 3) { #trueの場合に繰り返す #処理 $i++ } Do { #処理 $i++ } While ($i -lt 3) #trueの場合に繰り返す Do { #処理 } Until (条件) #trueになるまで繰り返す Break #ループを抜ける Continue #ループの最初に戻って継続する ※ラベルを使って多重ループから制御をジャンプすることも可能。
Start-Sleep -s 10 #10s待機 Start-Sleep -m 100 #100ms待機 Pause #Enterキー入力待ち Timeout /t 5 #指定時間何らかのキー入力待ち -1で無限待ち Exit #スクリプト終了 Exit 0 #スクリプト終了 終了コード:0
Function TestFnc { #引数が不要な場合 #処理 } Function TestFnc($a, $b, $c=1) { #引数を設定。$cの初期値を1にする #処理 Return 戻り値 #この時点で関数の実行は終了される。 } Function global:TestFnc { #グローバル関数として、他のスクリプトからも呼び出しが可 #処理 } 関数内で出力された内容は、全て呼び出し元に戻り値として返される。 関数内でダイアログなどの入力を行うと戻り値として返されるため注意。 戻り値に影響されないようにするには、変数に代入などする。 関数内での引数の取得は下記方法でも可能。 Param(args1, args2,…) $args[0]、$args[1]… ・関数コール 関数は呼び出す前に定義しておく必要があります。 TestFnc 1 2 #引数を渡す場合は半角スペース区切りにする。 TestFnc 1, 2, 3 #カンマ区切りにすると配列として渡される。 TestFnc (10+5) 2 ($str.Length) #()で計算結果を渡す TestFnc -a 1 -c 3 -b 2 #変数へ明示的に引数を渡せる
Out-GridView グリッド ビュー ウィンドウで表示する。 ほとんどのコマンドに対してパイプ記号“|”に続けて「Out-GridView」と指定することで表示できる。 Import-Csv "test.csv" | Out-GridView #CSVファイルを読み込みグリッドビューで表示する。 ipcsv "test.csv" | ogv #上記コマンドをエイリアスで記述 Get-Member オブジェクトのメンバー一覧を取得する。 $obj = New-Object System.Windows.Forms.OpenFileDialog $obj | Get-Member または、Get-Member -InputObject $obj #OpenFileDialogのメンバー一覧表示 Get-Alias 使用できるエイリアスを一覧表示できる。 1つのコマンドレットのエイリアスを一覧表示するには、Definition パラメーターを使用する。 Get-Alias -Definition Get-ChildItem #Get-ChildItemのエイリアスを一覧表示
$a = Read-Host "何か入力してください" $a = Read-Host "パスワードを入力してください" -AsSecureString # セキュア文字列を複合して平文にします $bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($a) $str = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr) Write-Host $str #プログレスバー For($b = 1 ; $b -le 1000 ; $b++) { $c = $b / 10 write-progress -Activity "計算しています" -Status "しばらくお待ちください" -PercentComplete $c -CurrentOperation "$c % 完了" } #-Activity ・・・ 任意の文字列(1行目) #-Status ・・・ 任意の文字列(2行目) #-PercentComplete ・・・ 現在の進捗を0~100の数値で指定します。省略した場合は進捗は0。 #-CurrentOperationは、現在処理中のファイル名等を表示する。上記例では進捗率を表示。
Get-Date -Format "d" #現在年月日を取得 Get-Date -Format "T" #現在時刻を取得 Get-Date -Format "yyyy/MM/dd HH:mm:ss" #現在日時をフォーマット指定して取得 (Get-Date).DayOfWeek #現在曜日を取得 $date = Get-Date #現在日日時を取得 echo $date.ToString("yyyy/MM/dd") #指定書式で文字列を取得 echo $date.AddDays(30).ToString("yyyy/MM/dd") #30日追加 (Get-Date -Year 2022 -Month 6 -Day 1).AddDays(30).ToString("yyyy/MM/dd") #日付計算結果 2022/07/01 (Get-Date -Hour 13 -Minute 30 -Second 45).AddSeconds(1000).ToString("T") #時間計算結果 13:47:25
Measure-Command { .\test.ps1 } #testスクリプト実行時の計測値 (Measure-Command { Start-Sleep -s 10 }).totalSeconds #スリープ時間の計測値(秒) $StartTime = Get-Date {処理} (Get-Date - $StartTime).totalSeconds #処理時間(秒)
・$Argsから取得 $Args[0]、$Args[1]、$Args[2]・・・ ・Param()にて取得 Param($a, $b, $c) #オプション記述方法 "test.ps1 1 2 3"または、"test.ps1 -b 2 -c 3 -a 1" Param([String]$Arg1, [Int]$Arg2) Param($Arg1 = "Test1", $Arg2 = 123) #指定しなければ初期値が代入 Param([parameter(mandatory=$true)]$Arg1) #オプションパラメータ必須 Param([ValidateSet("Test1","Test2")]$Arg1) #指定値以外はNG Param($Hostname = $Env:COMPUTERNAME, #ホスト名を初期値に設定 $Date = (Get-Date) #現在日時を初期値に設定 )
・存在確認 Test-Path ".\test.txt" #ファイル存在確認(する:True、しない:False) Test-Path -PathType container $Folder #フォルダか確認 ・ファイル、フォルダーの取得(Get-ChildItem) Get-ChildItem -Path C:\Windows フォルダー内のすべてのファイルとフォルダーの一覧表示。Path、Filter、Include、Exclude の各パラメーターを使用して項目をフィルター処理できます。 Get-ChildItem -Path C:\Windows -Recurse #サブフォルダー含む Get-ChildItem -Path C:\Windows -Force #非表示項目含む Get-ChildItem -Path C:\WINDOWS -Name #名前のみ Set-Location -Path $PSScriptRoot #カレントディレクトリをスクリプトのディレクトリへ変更 ・ファイル名取得(Path クラス) [System.IO.Path]::GetExtension($str_path) #拡張子のみ取り出す [System.IO.Path]::GetFileName($str_path) #ファイル名(拡張子有り)を取り出す [System.IO.Path]::GetFileNameWithoutExtension($str_path) #ファイル名(拡張子無し)を取り出す [System.IO.Path]::GetDirectoryName($str_path) #ディレクトリ情報を返します ・ファイルとフォルダーの作成(New-Item) New-Item -Path 'C:\temp\New Folder' -ItemType Directory #フォルダー新規作成 New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File #空のファイル新規作成 -Path ディレクトリパスを指定する。省略可能 -ItemType 作成する種類を指定する。省略時はファイル作成となる -Force 既存のファイルがあっても上書きする。フォルダーがない場合は作成する。 -Value 指定した文字列をデータに含める ・ファイルとフォルダーのコピー(Copy-Item) Copy-Item -Path C:\boot.ini -Destination C:\boot.bak -Force #上書きはForceを使用、読み取り専用時も可 Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe #フォルダーのコピー Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text #すべての .txt ファイルをコピー (New-Object -ComObject Scripting.FileSystemObject).CopyFile('C:\boot.ini', 'C:\boot.bak') #WSHのCOMオブジェクト使用 ・ファイルとフォルダーの削除(Remove-Item) Remove-Item -Path C:\temp\DeleteMe -Recurse #フォルダ削除の確認しない場合は、Recurseを使用 ・テキストファイルの読み込み(Get-Content) ※1行ずつ配列へ読み込みます。 Get-Content "ファイル名" #ファイル読み込み、出力 Get-Content -Path C:\boot.ini (Get-Content -Path C:\boot.ini).Length #読み込んだ行数 Get-Content ".\test.txt" -tail 5 #ファイルの最後5行 (Get-Content ".\test.txt")[2] #ファイルの3行目 (Get-Content ".\test.txt")[2..4] #ファイルの3~5行目 Get-Content ".\test.txt" | Where-Object { $_ -like "*ERROR*" } #ファイル内の"ERROR"を検索 Get-Content ".\test.txt" | Select-String -Pattern "Error" -CaseSensitive #ファイル内の"ERROR"(大文字・小文字を区別)を検索。 $Computers = Get-Content -Path C:\temp\DomainMembers.txt #コンピューター名、IPアドレスの一覧を取得しdomainMembers.txtに保存 # テキストファイルを1行ずつ読み込み $i = 1 foreach ($Str in Get-Content ".\test.txt") { Write-Host $Str $i++ } ・テキストファイルの書き込み(Out-File) Write-Output "abc" | Out-File ".\test.txt" Write-Output "abc" | Out-File -FilePath ".\test.txt" -Encoding default -Append #ファイルに追記 Write-Output "abc" | Out-File -FilePath ".\test.txt" -Force #読取専用ファイルに強制書き込み Write-Output test | Out-File .\test\test.txt -NoNewline #最後の改行は書き込まない 1..10 | Out-File test.log -NoClobber #上書き禁止 $Today = Get-Date Out-File -InputObject $val -FilePath .\test\test.txt #オブジェクトの内容を書き込み リダイレクト">"または、">>"でもファイル出力ができる。 Write-Output "abc" > ".\test.txt" #ファイル書き込み Write-Output "abc" >> ".\test.txt" #ファイルに追記 ・CSVファイルの読み書き $Csv = Import-Csv -Path ".\test.csv" -Encoding Default #CSVファイル読み込み $Csv = Import-Csv -Path test.csv -Header "Item1", "Item2", "Item3" #ヘッダ行がない場合 $Csv[5].Item2 = "abc" Write-Output $Csv | Export-Csv -Path ".\test.csv" -Encoding Default -NoTypeInformation 'オブジェクトを CSV に変換して出力 Import-Csv $FilePath | Out-GridView #CSVファイルを読み込みグリッドビューで表示 ・バイナリファイル [Byte[]]$Bin = Get-Content ".\Data.bin" -Encoding Byte #読み込み 数MBのファイルはNG Set-Content ".\Data.bin" -Value $Bin -Encoding Byte #書き込み 数MBのファイルはNG $Bin = [System.IO.File]::ReadAllBytes(".\Data.bin") #.Netクラス使用 読み込み [System.IO.File]::WriteAllBytes(".\Data.bin",$Bin) #.Netクラス使用 書き込み ・出力結果をログファイルに保存 $now = Get-Date -Format 'yyMMdd-HHmmss' #現在日付 $logname = "log_$now.txt" #logファイル名 Start-Transcript $logname #log記録開始 スクリプト処理 Stop-Transcript #log記録終了
Write-Output "abcde" | clip
notepad.exe test.txt #メモ帳起動 & 'C:\Program Files\test\test.exe' #空白を含むパスにある場合は、&を付ける . "test.ps1" #PowerShellスクリプト起動
$Result = Invoke-Expression -Command "ping localhost" #pingコマンドの実行結果を取得。戻り値は $lastExitCode に格納される。 ping.exe localhost | Tee-Object -Variable result #結果を標準出力と同時に$resultへ格納。戻り値は $lastExitCode に格納される。 $p = New-Object Diagnostics.Process $p.StartInfo.FileName = "ping.exe" $p.StartInfo.Arguments = "localhost" $p.StartInfo.UseShellExecute = $false $p.StartInfo.CreateNoWindow = $true #ウィンドウを開かない。 $p.StartInfo.RedirectStandardOutput = $true $p.StartInfo.RedirectStandardError = $true $null = $p.Start() #プロセス起動 $p.WaitForExit() #終了するまで待機 #$null = $p.CloseMainWindow() #ウィンドウを閉じます。 $stdout = $p.StandardOutput.ReadToEnd() $stderr = $p.StandardError.ReadToEnd() Write-Host "標準出力: $stdout" Write-Host "標準エラー出力: $stderr" Write-Host "戻り値: " + $p.ExitCode
Start-Process -FilePath notepad.exe -ArgumentList test.txt -Wait #外部プログラム起動、終了待ち Start-Process -FilePath test.doc -windowstyle Maximized #docファイルに関連付けられたプログラムで最大化して開かれる Start-Process -FilePath powershell.exe -ArgumentList "-noexit -command Get-Date" #別プロセスでPSを起動し日付表示 Get-Process -id 0 #プロセスID=0を取得 Get-Process -Name ex* #名前が "ex" で始まるプロセスを取得 Stop-Process -Name t*,e* -Confirm #名前が "t"と"e" で始まるプロセスを終了し確認メッセージを表示。-Forceオプションで強制終了 $Proc = Start-Process -FilePath "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" ` -ArgumentList "-ExecutionPolicy RemoteSigned -command .\test.ps1" ` -windowstyle Minimized -PassThru Stop-Process -InputObject $Proc #プロセス終了
ジョブをバックグラウンドで非同期に実行する。ジョブの実行中もスクリプトが中断されることなく作業できる。 新たなプロセスで実行され、処理が完了すると呼び出し元でその結果をReceive-Jobで受け取ることができる。 注)ファイル出力などをする場合は絶対パスで指定すること。相対パスだと標準出力と同じになる。 start-job {コマンドorスクリプト} #バックグラウンドジョブを開始 Get-Job ジョブの情報取得 Wait-Job ジョブの終了を待つ。-timeoutパラメータを使うと最大待ち時間(秒)を指定できる。 Stop-Job ジョブを停止 Remove-job ジョブを削除。ジョブが終了していない場合は-Forceオプションで強制終了 $job = Start-Job { Get-Process } #Background 演算子を使った記述は"$job = Get-Process &" $job = Start-Job -FilePath "スクリプト.ps1" $Result = Receive-job -job $job #ジョブの結果を取得。実行途中でもそれまでの結果を出力する。 $job.State #Stateプロパティでジョブの状態を確認。Complete:正常終了 Running:実行中 Failed:エラー終了
現在のプロセス内の別のスレッドでコマンドまたは式を実行するバックグラウンドジョブの一種。 実行速度が向上し、使用されるリソースも少なくなる。 Start-ThreadJob -ScriptBlock { Get-Process } $msg = "Hello" $msg | Start-ThreadJob { $input | Write-Output } | Wait-Job | Receive-Job #$msgを$input経由で渡し、結果を受け取る Start-ThreadJob { Write-Output $using:msg } | Wait-Job | Receive-Job #$msgを$using経由で渡し、結果を受け取る
リモートコンピューターでバックグラウンドジョブを実行する。 Enter-PSSession -computername Server01 #Server01 コンピューター上で対話型セッションを開始 Server01\C:> $job = Start-Job -scriptblock { Get-Eventlog "Windows PowerShell" } #コマンドプロンプトが変更され、リモートジョブを開始する Invoke-Command -computername Server01 -scriptblock { Get-Eventlog system } -AsJob #Server01コンピューター上でジョブを開始しイベントを取得する $s = New-PSSession -computername Server01 Invoke-Command -session $s -command { New-Item "C:\test.txt" } #Server01コンピューター上でC:\test.txtを作成
Register-ObjectEvent -InputObject オブジェクト -EventName イベント -Action { イベント発生時処理 } -SourceIdentifier サブスクライブ名 Get-EventSubscriber サブスクライブ名 #サブスクライバーの一覧を取得 Unregister-Event サブスクライブ名 #サブスクライバーを解除 $p = New-Object Diagnostics.Process $p.StartInfo.FileName = "ipconfig.exe" #起動する子プロセス $p.StartInfo.Arguments = "" #起動パラメータ $p.StartInfo.UseShellExecute = $false #シェルを使用せずに起動 $p.StartInfo.CreateNoWindow = $true #ウィンドウを開かない。 $p.StartInfo.RedirectStandardOutput = $true #標準出力をリダイレクトする # イベントハンドラー $stdOutEvent = Register-ObjectEvent -InputObject $p -EventName "OutputDataReceived" -Action { Write-Output $EventArgs.Data } [void]$p.Start() #プロセス起動 $p.BeginOutputReadLine() #標準出力の非同期読み込みを開始 do { $Str = Receive-job -job $stdOutEvent #標準出力を取得 If ($Str -ne $null) { Write-Host $Str } } While ($true)
Windowsや.Netが提供するものであれば、次のコマンドで呼び出しでき指定されたアセンブリがPowerShellセッションに追加される。 Add-Type -Assembly "アセンブリ名" Add-Type -Path "ファイルのパス" または、 [System.Reflection.Assembly]::LoadFrom("ファイルのパス") [System.Reflection.Assembly]::LoadFile("ファイルのパス") Add-type -assembly "System.Windows.Forms" [System.Windows.Forms.MessageBox]::Show("!!!!") [System.Reflection.Assembly]::LoadFile("D:\ClassLibrary2.dll") $c = New-Object ClassLibrary2.Class1 $c.NewProperty = "ABC" #C#クラス定義 $Signature = @" [DllImport("user32.dll", CharSet = CharSet.Unicode)] //DLL読み込み public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type); //メッセージボックス定義 "@ $MsgBox = Add-Type -MemberDefinition $Signature -Name Win32ApiFunctions -PassThru $MsgBox::MessageBox(0, "Hello, World!", "Test", 0)
Out-Printer プリンターに出力を送信します。 Get-ChildItem | Out-Printer #既定のプリンターにファルダ情報の実行結果を印刷する Get-Content -Path ./readme.txt | Out-Printer #既定のプリンターに印刷するファイルを送信する "Hello, World" | Out-Printer -Name "\\Server01\Prt-6B Color" #リモート プリンターに文字列を印刷する $H = Get-Help -Full Get-CimInstance Out-Printer -InputObject $H ヘルプを既定のプリンターに印刷する $Default_printer = Get-WmiObject Win32_Printer | Where-Object Default -eq $true #デフォルトプリンタを確認 $printer = Get-WmiObject Win32_Printer | Where-Object Name -eq "Microsoft Print to PDF" #プリンタを選択 $printer.SetDefaultPrinter() #選択したプリンタをデフォルトにする Set-PrintConfiguration $printer.name -Color $False #白黒印刷 ※プリンタによって操作できない場合がある $Printer.DefaultPaperType="B5" #基本の用紙サイズを変更 Start-Process "a.txt" -Verb Print -WindowStyle Hidden -Wait #メモ帳で印刷 非表示 終了を待つ $Default_printer.SetDefaultPrinter() #デフォルトプリンタを元に戻す
・Timerクラス $Timer = New-Object Timers.Timer #$Timer.AutoReset = $true #イベントを繰り返す$true 一度のみ$false $Timer.Interval = 1000 #タイマー間隔 ms # タイマーのイベント処理を登録 $Job = Register-ObjectEvent ` -inputObject $Timer ` -eventName Elapsed ` -sourceIdentifier testEventSample ` -Action { myTimerFunction } # タイマーの処理 $T = 0 #スクリプトスコープ function global:myTimerFunction { #グローバルスコープとして登録 $script:T++ # スクリプトスコープで参照 } $timer.Start() # タイマー開始 $timer.Enabled = $trueでも可 Write-Host $T ;経過時間表示 $timer.Stop() # タイマー停止 $timer.Enabled = $falseでも可 # タイマー削除 unregister-event testEventSample #イベント処理を削除 remove-item function:myTimerFunction # 関数を削除 ・Windows.Formsを使った方法 Add-Type -AssemblyName System.Windows.Forms #アセンブリの読み込み $Timer = New-Object System.Windows.Forms.Timer $Timer.Interval = 10 #イベントを発生させる間隔(ms) $Time = { #処理 } $Timer.Add_Tick($Time) $Timer.Start() #タイマー起動 $Timer.Stop() #タイマー終了
$Watch = New-Object System.Diagnostics.Stopwatch $Watch.Start() $Watch.Stop() $Watch.Reset() $Watch.Elapsed #経過時間の合計を返す $Watch.Running #起動中かどうか
・System.Windows.Formsを使用する場合 Add-Type -AssemblyName System.Windows.Forms #アセンブリのロード $result = [System.Windows.Forms.MessageBox]::Show("メッセージ", "タイトル", "YesNo", "Question", "Button2") #メッセージボックス #ボタンの種類 1.OK、2.OKCancel、3.AbortRetryIgnore、4.YesNoCancel、5.YesNo、6.RetryCancel #アイコンの種類 1.None、2.Hand、3.Error、4.Stop、5.Question、6.Exclamation、7.Warning、8.Asterisk、9.Information $dialog = New-Object System.Windows.Forms.FolderBrowserDialog #フォルダ選択ダイアログのオブジェクト取得 $dialog.Description = "テストディレクトリを選択" #ダイアログへ説明を追加 $dialog.ShowNewFolderButton = $false #新規ディレクトリ作成のボタンを非表示 $dialog.SelectedPath = "C:\Perl" #デフォルト選択ディレクトリの設定 If($dialog.ShowDialog() -eq "OK"){ $dialog.SelectedPath }Else{ "選択なし" } $dialog = New-Object System.Windows.Forms.OpenFileDialog # ファイル選択ダイアログのオブジェクト取得 $dialog.Filter = 'テキストファイル(*.txt)|*.txt|全てのファイル(*.*)|*.*' # フィルタ条件の設定 $dialog.Title = "ファイルを選択してください" # タイトルの設定 $dialog.ShowHelp = $true; # ヘルプの設定 $dialog.InitialDirectory = 'Desktop' # デフォルト選択ディレクトリの設定 $dialog.MultiSelect = $true # 複数ファイルを選択する。 if ($dialog.ShowDialog() -eq "OK") { $PATH = $dialog.FileName # 選択したファイルのパスを変数PATHに格納する } else { $PATH = '選択なし。' } ・VisualBasicを使用する場合 Add-Type -AssemblyName "Microsoft.VisualBasic" #アセンブリのロード $result = [Microsoft.VisualBasic.Interaction]::MsgBox("メッセージ", button, "タイトル") #メッセージボックス #ボタン 0.OK、1.OKCancel、2.AbortRetryIgnore、3.YesNoCancel、4.YesNo、5.RetryCancel #戻り値 1.Ok、2.Cancel、3.Abort、4.Retry、5.Ignore、6.Yes、7.No $INPUT = [Microsoft.VisualBasic.Interaction]::InputBox("メッセージ", "タイトル", "初期値", XPos, YPos) # インプットボックス [Microsoft.VisualBasic.FileIO.FileSystem]::CopyFile(".\でかいデータ.txt", ".\コピー先.txt", [Microsoft.VisualBasic.FileIO.UIOption]::AllDialogs) #進捗ダイアログを出してファイルをコピー [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile(".\ごみ.txt", [Microsoft.VisualBasic.FileIO.UIOption]::AllDialogs, [Microsoft.VisualBasic.FileIO.RecycleOption]::SendToRecycleBin) #ファイルをごみ箱に削除
Select-String -Path ".\test.txt" -Pattern "abc" 一致するデータを検索 Where-Object 絞り込み Sort-Object ソート(降順:-Descending、重複取り除く:-Unique)
$oWS = New-Object -ComObject Wscript.Shell #COMオブジェクトの生成 $result = $oWS.popup("メッセージ", 表示秒数, "タイトル", ボタン種) #ポップアップメッセージ #ボタン 0.OK、1.OKCancel、2.AbortRetryIgnore、3.YesNoCancel、4.YesNo、5.RetryCancel #戻り値 1.Ok、2.Cancel、3.Abort、4.Retry、5.Ignore、6.Yes、7.No $oSA = New-Object -Com Shell.Application #COMオブジェクトの生成 $folderPath = $oSA.BrowseForFolder(0,"対象フォルダーを選択してください",0,"C:\") #フォルダ選択ダイアログ if ( $folderPath -eq $null) { exit } $PATH = $folderPath.Self.Path
$excel = New-Object -ComObject Excel.Application # Excelオブジェクト作成 $excel.Visible = $true #Excelの可視化 #$book = $excel.Workbooks.Add() # ワークブック新規作成 $book = $excel.Workbooks.Open(".\test.xlsx") # Excelファイルのオープン $sheet = $excel.Worksheets.Item("Sheet1") # シート選択 $sheet.Cells.Item(2,3) = "あいうえお" #セル入力 #$range =$sheet.Range("A1") #セル選択 #$range.Value ="あいうえお" #セル入力 #Write-Host $range.Value() #セル値表示 #$sheet.ActivePrinter = "" #印刷するプリンタ。未指定時はデフォルトプリンタ #$sheet.Copies = 1 #印刷部数 #$book.printout() #ワークブック印刷 #$book.SaveAs("F:\usr\PowerShell\sample_07\Test\PS-Test01.xlsx") #ブック名前を付けて保存 $book.Save() #ブック保存 $excel.Quit() #Excelを閉じる #プロセスの削除 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($book) [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
$word = new-object -comObject Word.Application # Wordオブジェクト作成 $word.Visible = $true # Wordの可視化 $doc = $word.Documents.Add() # ドキュメント新規作成 #$doc = $app.Documents.Open(".\test.docx") # ドキュメントファイルのオープン $doc.Content.Text = "あいうえお" $doc.SaveAs(".\test.docx") $word.Quit() $word = $null
# IEオブジェクト作成 $ie = New-Object -ComObject InternetExplorer.Application; $ie.Visible = $true #IE可視化 $ie.Toolbar = $false #ツールバー非表示 $ie.MenuBar = $false #メニューバー非表示 $ie.AddressBar = $false #アドレスバー非表示 $ie.StatusBar = $false #ステータスバー非表示 # URLをオープン $URL = "http://www.mf.ccnw.ne.jp/kamehouse102/index.html" #$URL = "C:\Users\user\Desktop\見積書.htm" $ie.Navigate($URL, 4) #キャッシュ無効 #$ie.Navigate2($URL) #URL表示 # Webページの読み込みが終わるまで待機 while ($ie.busy -or $ie.readystate -ne 4) { Start-Sleep -Milliseconds 100 } #while ($ie.busy) { Start-Sleep -Milliseconds 100 } #ローカルファイルを開く場合 # HTMLドキュメントを取得する $doc = $ie.Document # ページ上でコントロールを探して操作をします。 # 下記では、HTMLのid属性とname属性を使って目的のコントロールを探しています。 # テキストボックスをIDで探し、値をセットする $textbox =$doc.getElementById('lst-ib') if ($textbox -ne $null) { $textbox.value = "テキスト入力値" } # 検索ボタンをNameで探し、押下する $buttons = $doc.getElementsByName('btnK') if ($buttons -ne $null) { $buttons[0].click() } # ExecWBメソッドにてIE操作 #ExecWB(OLECMDID, OLECMDEXECOPT, pvaIn, pvaOut) #$ie.ExecWB(6, 2) #デフォルトプリンタに印刷ダイアログなしで印刷する $ie.ExecWB(7, 1) #印刷ダイアロ表示 # IEを終了する $ie.Quit()
[Console]::Beep(262,500) #Beep音(周波数, 長さms)周波数 262:ド 294:レ 330:ミ 349:ファ 392:ソ 440:ラ 494:シ 523:ド