プログラミングのすすめ 第十歩で始めた Windows PowerShell ですが、前回で分かったように Windows PowerShell はかなり高度です。プログラミングのすすめ 第六歩で、VBで作ったグラフ用データ作成プログラムも プログラミングのすすめ 第七歩のHTMLファイルの作成も PowerShell だけで代替することが出来ました。
今回は PowerShell でよく使われるコマンドレットや、メソッド、関数、演算子 等々を実際に実行しながら分かり易くまとめて行きたいと思います。
会員数は国内最大級の180万人を突破!【paters】- よく使うコマンドレット
- Get-Content ファイルの内容を取得する
- Get-Date 現在の日付と時刻を取得する
- Select-String ファイル内のテキストを検索する
- Set-Location 現在の作業場所を指定された場所に設定します。
- Out-String 入力オブジェクトをストリングに変換する
- Out-File ファイルに書き出す
- Write-OutPut パイプラインに書き込む、コンソールに書き込む
- Add-Content ファイルに追加する
- Get-ChildItem ディレクトリの内容を取得する
- Rename-Item Itemの名前を変更する
- ForEach-Object 各入力オブジェクトに対して操作を実行する
- Format-List オブジェクトのプロパティをリスト形式で表示する
- Select-Object オブジェクト、オブジェクトのプロパティ を選択する
- Sort-Object オブジェクトのプロパティの値でオブジェクトを並べ変える
- Set-ExecutionPolicy スクリプトの実行ポリシーを変更する
- Test-Path ファイルの存在を調べる
- よく使う関数、演算子、メソッド
- 応用編、およびスクリプト
よく使うコマンドレット
Get-Content ファイルの内容を取得する
エイリアスは、 cat , gc ,type の三つが充てられています。
PS C:\PS_Work> Get-Alias -Definition Get-Content
CommandType Name Version Source
----------- ---- ------- ------
Alias cat -> Get-Content
Alias gc -> Get-Content
Alias type -> Get-Content
Get-Content は、ファイルの内容を取得します。
-head で先頭から取得する項目数を指定できます。 -tail で末尾から取得する項目数を指定できます。
PS C:\PS_Work> cat test1.txt
This is test1 0 AAAA3,ABC,123,12345
This is line 2 of test1 1 bbbb3,2222,33333
This is line 3 test1 2 CCCC3
This is line 4 test1 3 dddd3,3333,4444,55555
PS C:\PS_Work> cat test1.txt -head 2
This is test1 0 AAAA3,ABC,123,12345
This is line 2 of test1 1 bbbb3,2222,33333
PS C:\PS_Work> cat test1.txt -tail 2
This is line 3 test1 2 CCCC3
This is line 4 test1 3 dddd3,3333,4444,55555
PowerShell でパラメータを入れる場合、他のパラメータと区別できるところまで短縮できます。この例では、Get-Content で使えるパラメータで h で始まるのは -head だけなので -h まで短縮できます。一方 -tail は、t で始まるパラメータは、他に -TotalCount が存在するので、 -ta までしか短縮できません。
PS C:\PS_Work> cat test1.txt -head 1
This is test1 0 AAAA3,ABC,123,12345
PS C:\PS_Work> cat test1.txt -hea 1
This is test1 0 AAAA3,ABC,123,12345
PS C:\PS_Work> cat test1.txt -he 1
This is test1 0 AAAA3,ABC,123,12345
PS C:\PS_Work> cat test1.txt -h 1
This is test1 0 AAAA3,ABC,123,12345
PS C:\PS_Work> cat test1.txt -tail 1
This is line 4 test1 3 dddd3,3333,4444,55555
PS C:\PS_Work> cat test1.txt -tai 1
This is line 4 test1 3 dddd3,3333,4444,55555
PS C:\PS_Work> cat test1.txt -ta 1
This is line 4 test1 3 dddd3,3333,4444,55555
PS C:\PS_Work> cat test1.txt -t 1
Get-Content : パラメーター名 't' があいまいなため、パラメーターを処理できません。一致する名前の候補は次のとおりです: -TotalCount -Tail。
発生場所 行:1 文字:15
+ cat test1.txt -t 1
-head は、 -TotalCount , -First でも同じです。
PS C:\PS_Work> cat test1.txt -TotalCount 1
This is test1 0 AAAA3,ABC,123,12345
PS C:\PS_Work> cat test1.txt -Total 1
This is test1 0 AAAA3,ABC,123,12345
PS C:\PS_Work> cat test1.txt -Tot 1
This is test1 0 AAAA3,ABC,123,12345
PS C:\PS_Work> cat test1.txt -To 1
This is test1 0 AAAA3,ABC,123,12345
PS C:\PS_Work> cat test1.txt -First 1
This is test1 0 AAAA3,ABC,123,12345
PS C:\PS_Work> cat test1.txt -Fi 1
Get-Content : パラメーター名 'Fi' があいまいなため、パラメーターを処理できません。一致する名前の候補は次のとおりです: -Filter -TotalCount。
発生場所 行:1 文字:15
+ cat test1.txt -Fi 1
+ ~~~
+ CategoryInfo : InvalidArgument: (:) [Get-Content]、ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameter,Microsoft.PowerShell.Commands.GetContentCommand
PS C:\PS_Work> cat test1.txt -Fir 1
This is test1 0 AAAA3,ABC,123,12345
-Delimiter で区切り文字を指定できます。ディフォルトでは改行が区切り文字です。
PS C:\PS_Work> cat test1.txt -Delimiter ','
This is test1 0 AAAA3,
ABC,
123,
12345
This is line 2 of test1 1 bbbb3,
2222,
33333
This is line 3 test1 2 CCCC3
This is line 4 test1 3 dddd3,
3333,
4444,
55555
Get-Date 現在の日付と時刻を取得する
Get-Date は、現在の日付と時刻を取得します。
–DisplayHint 表示する要素を指定します。 Date 日付のみ表示 Time 時刻のみ表示 DateTime 日付と時刻を表示
PS C:\ps_work> Get-Date -DisplayHint Date
2022年11月16日
PS C:\ps_work> Get-Date -DisplayHint Time
23:03:05
PS C:\ps_work> Get-Date -DisplayHint DateTime
2022年11月16日 23:03:12
-DisplayHint は、デフォルトでは DateTime になっています。
PS C:\ps_work> Get-Date
2022年11月16日 23:06:01
PS C:\ps_work> Get-Date | Format-List
DisplayHint : DateTime
Date : 2022/11/16 0:00:00
Day : 16
DayOfWeek : Wednesday
DayOfYear : 320
Hour : 23
Kind : Local
Millisecond : 787
Minute : 6
Month : 11
Second : 34
Ticks : 638042367947873098
TimeOfDay : 23:06:34.7873098
Year : 2022
DateTime : 2022年11月16日 23:06:34
-Format 表示するフォーマットを指定します。
指定子 | 定義 |
---|---|
dddd | 曜日 – フル ネーム |
MM | 月の番号 |
dd | 月の日 – 2 桁 |
yyyy | 4 桁の形式の年 |
HH:mm | 24 時間形式の時刻 -秒なし |
K | 世界時座標 (UTC) からのタイム ゾーン オフセット |
PS C:\ps_work> Get-Date -Format "MM/dd dddd HH:mm"
11/16 水曜日 23:12
PS C:\ps_work> Get-Date -Format "MM/dd/yyyy HH:mm"
11/16/2022 23:12
PS C:\ps_work> Get-Date -Format "MM/dd/yyyy HH:mm K"
11/16/2022 23:13 +09:00
PS C:\ps_work> Get-Date -Format "MM/dd/yyyy dddd HH:mm K"
11/16/2022 水曜日 23:13 +09:00
-Date 表示する日付と時刻を設定します。現在の日付と時刻を表示せずに、設定した日付と時刻を表示します。”01/01/2000 00:00:00″ のフォーマットで設定します。日付のみの指定、時刻のみの指定も出来ます。 -Format で曜日を表示すれば、その日が何曜日になるか、何曜日だったかを知ることが出来ます。
PS C:\ps_work> Get-Date -Date "12/31/2022 23:59:59"
2022年12月31日 23:59:59
PS C:\ps_work> Get-Date -Date "12/31/2022 23:59:59" -Format "MM/dd/yyyy dddd HH:mm"
12/31/2022 土曜日 23:59
PS C:\ps_work> Get-Date -Date "12/31/2022" -Format "MM/dd/yyyy dddd HH:mm"
12/31/2022 土曜日 00:00
PS C:\ps_work> Get-Date -Date "00:00:00" -Format "yyyy年MM月dd日 dddd HH時mm分"
2022年11月16日 水曜日 00時00分
Select-String ファイル内のテキストを検索する
エイリアスは、 sls です。
PS C:\PS_Work> Get-Alias -Definition Select-String
CommandType Name Version Source
----------- ---- ------- ------
Alias sls -> Select-String
Select-String は、文字列とファイル内のテキストを検索します。
-Pattern で検索する文字列を指定します。 -Pattern は省略可能です。ディフォルトでは大文字、小文字は区別されません。
PS C:\PS_Work> cat test1.txt
This is test1 0 AAAA3,ABC,123,12345
This is line 2 of test1 1 bbbb3,2222,33333
This is line 3 test1 2 CCCC3
This is line 4 test1 3 dddd3,3333,4444,55555
PS C:\PS_Work> Select-String -Pattern 222 test1.txt
test1.txt:2:This is line 2 of test1 1 bbbb3,2222,33333
PS C:\PS_Work> Select-String abc test1.txt
test1.txt:1:This is test1 0 AAAA3,ABC,123,12345
上記のようにファイル指定して実行すると、アウトプットの先頭にファイル名と行数が出力されます。
パイプラインで入力を受けるとファイル名、行数は入りません。
PS C:\PS_Work> cat test1.txt | Select-String -Pattern 222
This is line 2 of test1 1 bbbb3,2222,33333
-NotMatch で文字列が含まれない項目を出力します。 -NotMatch は -n まで省略可能です。
PS C:\PS_Work> cat test1.txt | Select-String -NotMatch abc
This is line 2 of test1 1 bbbb3,2222,33333
This is line 3 test1 2 CCCC3
This is line 4 test1 3 dddd3,3333,4444,55555
PS C:\PS_Work> cat test1.txt | Select-String -n abc
This is line 2 of test1 1 bbbb3,2222,33333
This is line 3 test1 2 CCCC3
This is line 4 test1 3 dddd3,3333,4444,55555
-CaseSensitive 大文字、小文字を区別したい時に指定します。
PS C:\PS_Work> cat test2.txt | Select-String -Pattern This
This is test2 0 AAAA3,ABC,123,12345
this is line 2 of test2 1 bbbb3,2222,33333
this is line 3 test2 2 CCCC3
This is line 4 test2 3 dddd3,3333,4444,55555
PS C:\PS_Work> cat test2.txt | Select-String -Pattern This -CaseSensitive
This is test2 0 AAAA3,ABC,123,12345
This is line 4 test2 3 dddd3,3333,4444,55555
-Context 一致した前後の行を表示します。 次の例では -Context 1,2 で一致した行に “>” を表示し、前1行、後ろ2行を表示します。
PS C:\PS_Work> cat test3.txt
This is test3 0 AAAA3,ABC,123,12345
This is line2 of test3 1 bbbb3,2222,33333
This is line3 test3 2 CCCC3, Match
This is line4 test3 3 dddd3,3333,Match,4444,55555
This is line5 test3 3 dddd3,3333,4444,55555
This is line6 test3 3 dddd3,3333,4444,55555
This is line7 test3 3 dddd3,3333,4444,55555
PS C:\PS_Work> cat test3.txt | Select-String -Pattern match -context 1,2
This is line2 of test3 1 bbbb3,2222,33333
> This is line3 test3 2 CCCC3, Match
> This is line4 test3 3 dddd3,3333,Match,4444,55555
This is line5 test3 3 dddd3,3333,4444,55555
This is line6 test3 3 dddd3,3333,4444,55555
Set-Location 現在の作業場所を指定された場所に設定します。
Change Directoryと同じ働きをしますが、ディレクトリ名に Squire Brackets [] 等の特殊文字があるとコマンドプロンプトの時のようには動きません 。特殊文字があるときは、パス指定に -LiteralPath を指定します。
PS >Get-Item CLIMAX*
ディレクトリ: W:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2021/09/16 9:36 CLIMAX BEST 歌謡曲 [ Disk 1 ]
d----- 2021/09/16 9:36 CLIMAX Best 歌謡曲 [ Disk 2 ]
-Path では見つからない。
PS >Set-Location -Path 'CLIMAX BEST 歌謡曲 [ Disk 1 ]'
Set-Location : パス 'CLIMAX BEST 歌謡曲 [ Disk 1 ]' が存在しないため検出できません。
発生場所 行:1 文字:1
+ Set-Location -Path 'CLIMAX BEST 歌謡曲 [ Disk 1 ]'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-LiteralPath を指定します。
PS >Set-Location -LiteralPath 'CLIMAX BEST 歌謡曲 [ Disk 1 ]'
PS >pwd
Path
----
W:\CLIMAX BEST 歌謡曲 [ Disk 1 ]
Out-String 入力オブジェクトをストリングに変換する
オブジェクトの入力を文字列に変換します。 -Stream パラメータを使用することにより一行づつ処理することが出来ます。 Out-String -Stream は、短縮形 OSS でパイプラインで使用されます。
次の例では、Get-ChildItem の出力を Select-String で test の文字列が含まれるアイテムだけを出力したいのですが、Get-ChildItem の出力はオブジェクトのため、Out-String -Stream で 一行の文字列に変換してから、Select-String で test の文字列が含まれる行だけを出力しています。
PS C:\PS_work> Get-ChildItem
ディレクトリ: C:\PS_work
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022/11/13 18:09 work1
d----- 2022/11/13 17:57 work2
d----- 2022/11/10 16:07 work3
-a---- 2022/11/14 11:55 2276 Add-Signature.ps1
-a---- 2022/11/14 12:03 3552 Get-MP3MetaData_LocalMade.ps1
-a---- 2022/11/11 0:40 32 KanjiCopy.txt
-a---- 2022/11/11 10:17 34 kanjiTest.txt
-a---- 2022/11/10 15:53 72 test.txt
-a---- 2022/11/10 18:52 158 test1.txt
-a---- 2022/11/11 0:17 634 Test1Copy.txt
-a---- 2022/11/10 19:12 158 test2.txt
-a---- 2022/11/10 23:07 306 test3.txt
-a---- 2022/11/10 23:21 311 test4.txt
-a---- 2022/11/11 10:30 18 TestDesu.txt
-a---- 2022/11/13 13:10 228 TestSort.txt
-a---- 2022/11/13 13:52 94 TestSort2.txt
PS C:\PS_work> Get-ChildItem | OSS | Select-String -Pattern test
-a---- 2022/11/11 10:17 34 kanjiTest.txt
-a---- 2022/11/10 15:53 72 test.txt
-a---- 2022/11/10 18:52 158 test1.txt
-a---- 2022/11/11 0:17 634 Test1Copy.txt
-a---- 2022/11/10 19:12 158 test2.txt
-a---- 2022/11/10 23:07 306 test3.txt
-a---- 2022/11/10 23:21 311 test4.txt
-a---- 2022/11/11 10:30 18 TestDesu.txt
-a---- 2022/11/13 13:10 228 TestSort.txt
-a---- 2022/11/13 13:52 94 TestSort2.txt
Out-File ファイルに書き出す
Out-File のエイリアスはありません。
Out-File は、出力をファイルに書き出します。
PS C:\PS_Work> cat test1.txt | Out-File Test1Copy.txt
PS C:\PS_Work> cat Test1Copy.txt
This is test1 0 AAAA3,ABC,123,12345
This is line 2 of test1 1 bbbb3,2222,33333
This is line 3 test1 2 CCCC3
This is line 4 test1 3 dddd3,3333,4444,55555
-NoClobber ファイルが既に存在する場合、上書きを防ぎます。
PS C:\PS_Work> cat test1.txt | Out-File Test1Copy.txt -NoClobber
Out-File : ファイル 'C:\PS_Work\Test1Copy.txt' は既に存在します。
発生場所 行:1 文字:17
+ cat test1.txt | Out-File Test1Copy.txt -NoClobber
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceExists: (C:\PS_Work\Test1Copy.txt:String) [Out-File], IOException
+ FullyQualifiedErrorId : NoClobber,Microsoft.PowerShell.Commands.OutFileCommand
-Append 既存のファイルの末尾に出力を追加します。
PS C:\PS_Work> cat test2.txt | Out-File Test1Copy.txt -Append
PS C:\PS_Work> cat Test1Copy.txt
This is test1 0 AAAA3,ABC,123,12345
This is line 2 of test1 1 bbbb3,2222,33333
This is line 3 test1 2 CCCC3
This is line 4 test1 3 dddd3,3333,4444,55555
This is test2 0 AAAA3,ABC,123,12345
this is line 2 of test2 1 bbbb3,2222,33333
this is line 3 test2 2 CCCC3
This is line 4 test2 3 dddd3,3333,4444,55555
-Width 書き出すファイルの行の長さを指定します。
長い行のテキストファイルを Get-Content で取得して、Select-String で抽出し Out-File で書き出すという処理をした場合、その時のPowerShell の画面が狭くてテキストファイルの行より短れば、以下のように書き出されたファイルのテキストは、画面の幅で改行されたものになってしまいます。これを防ぐために -width で書き出すファイルの行幅を指定します。
PS >cat 長い行.txt | sls "決済" | Out-File 狭い画面.txt
PS >cat 狭い画面.txt
"AUD/JPY","買","決済","1","93.888","130","0","130","2022/11/26 01:16:41","2022/11/26 01:16:41"
,"126000007726405","-","0","\130"
"AUD/JPY","売","決済","1","93.934","30","0","30","2022/11/26 01:12:06","2022/11/26 01:12:06","
126000007726300","-","0","\30"
"AUD/JPY","買","決済","1","93.902","80","0","80","2022/11/26 01:09:59","2022/11/26 01:09:59","
126000007726224","-","0","\80"
同じ画面サイズで -Width 180 を指定して実行しました。
PS >cat 長い行.txt | sls "決済" | Out-File 狭い画面width指定.txt -Width 180
PS >cat 狭い画面width指定.txt
"AUD/JPY","買","決済","1","93.888","130","0","130","2022/11/26 01:16:41","2022/11/26 01:16:41","126000007726405","-","0","\130"
"AUD/JPY","売","決済","1","93.934","30","0","30","2022/11/26 01:12:06","2022/11/26 01:12:06","126000007726300","-","0","\30"
"AUD/JPY","買","決済","1","93.902","80","0","80","2022/11/26 01:09:59","2022/11/26 01:09:59","126000007726224","-","0","\80"
Write-OutPut パイプラインに書き込む、コンソールに書き込む
エイリアスは echo , write の二つです。
PS C:\ps_work> get-alias -Definition write-output
CommandType Name Version Source
----------- ---- ------- ------
Alias echo -> Write-Output
Alias write -> Write-Output
Write-OutPut は、指定したオブジェクトをパイプラインに書き込みます。
PS C:\ps_work> Write-Output 'Testです' | Out-File TestDesu.txt
PS C:\ps_work> cat TestDesu.txt
Testです
Add-Content ファイルに追加する
エイリアスは ac です。
PS C:\ps_work> get-alias -Definition add-content
CommandType Name Version Source
----------- ---- ------- ------
Alias ac -> Add-Content
Add-Content は、前述の Out-File -Append と同じ動きをします。
PS C:\ps_work> cat kanjitest.txt
漢字です。
PS C:\ps_work> write-output 'Test です' | Add-Content KanjiTest.txt
PS C:\ps_work> cat kanjitest.txt
漢字です。
Test です
PS C:\ps_work> write-output 'Test です' | Add-Content KanjiTest.txt
PS C:\ps_work> cat kanjitest.txt
漢字です。
Test です
Test です
Get-ChildItem ディレクトリの内容を取得する
エイリアスは、dir , gci , ls の三つが充てられています。
PS C:\ps_work> get-alias -definition get-childitem
CommandType Name Version Source
----------- ---- ------- ------
Alias dir -> Get-ChildItem
Alias gci -> Get-ChildItem
Alias ls -> Get-ChildItem
Get-ChildItem は、ディレクトリの内容を取得します。
-Path でディレクトリを指定します。 -Path は省略できます。
PS C:\> Get-ChildItem -Path \PS_Work
ディレクトリ: C:\PS_Work
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022/11/10 16:07 work1
d----- 2022/11/10 16:07 work2
d----- 2022/11/10 16:07 work3
-a---- 2022/11/11 0:40 32 KanjiCopy.txt
-a---- 2022/11/11 10:17 34 kanjiTest.txt
-a---- 2022/11/10 15:53 72 test.txt
-a---- 2022/11/10 18:52 158 test1.txt
-a---- 2022/11/11 0:17 634 Test1Copy.txt
-a---- 2022/11/10 19:12 158 test2.txt
-a---- 2022/11/10 23:07 306 test3.txt
-a---- 2022/11/10 23:21 311 test4.txt
-a---- 2022/11/11 10:30 18 TestDesu.txt
-Recurse でサブディレクトリも取得します。空のディレクトリは表示しません。
PS C:\> Get-ChildItem -Path \PS_Work -Recurse
ディレクトリ: C:\PS_Work
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022/11/10 16:07 work1
d----- 2022/11/10 16:07 work2
d----- 2022/11/10 16:07 work3
-a---- 2022/11/11 0:40 32 KanjiCopy.txt
-a---- 2022/11/11 10:17 34 kanjiTest.txt
-a---- 2022/11/10 15:53 72 test.txt
-a---- 2022/11/10 18:52 158 test1.txt
-a---- 2022/11/11 0:17 634 Test1Copy.txt
-a---- 2022/11/10 19:12 158 test2.txt
-a---- 2022/11/10 23:07 306 test3.txt
-a---- 2022/11/10 23:21 311 test4.txt
-a---- 2022/11/11 10:30 18 TestDesu.txt
ディレクトリ: C:\PS_Work\work1
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/11/10 15:53 72 test.txt
Rename-Item Itemの名前を変更する
エイリアスは、ren , rni です。
PS >Get-Alias -Definition Rename-Item
CommandType Name Version Source
----------- ---- ------- ------
Alias ren -> Rename-Item
Alias rni -> Rename-Item
Rename-Item -Path ‘アイテム名’ -NewName ‘新しいアイテム名’
-Path -NewName は、省略できます。
アイテム名は、ファイル名でもディレクトリ名でも変更します。
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022/11/08 17:45 September
-a---- 2022/11/26 2:07 5511 TradeRecordList (12).csv
PS >ren 'TradeRecordList (12).csv' 'TradeRecordList(12).csv'
d----- 2022/11/08 17:45 September
-a---- 2022/11/26 2:07 5511 TradeRecordList(12).csv
PS >ren 'September' 'sep'
d----- 2022/11/08 17:45 sep
-a---- 2022/11/26 2:07 5511 TradeRecordList(12).csv
Replace 置換演算子と組み合わせてあるパターンをまとめて変更出来ます。次の例は、ファイル名の中のスペースを削除しています。
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/11/26 2:07 5511 TradeRecordList (12).csv
-a---- 2022/10/16 22:44 12510 TradeRecordList (13).csv
-a---- 2022/10/16 22:44 12637 TradeRecordList (14).csv
-a---- 2022/10/16 22:44 12536 TradeRecordList (15).csv
-a---- 2022/10/16 22:45 12512 TradeRecordList (16).csv
-a---- 2022/10/16 22:45 12513 TradeRecordList (17).csv
-a---- 2022/10/16 22:47 7502 TradeRecordList (18).csv
-a---- 2022/11/26 2:09 5517 TradeRecordList (20).csv
-a---- 2022/11/26 2:09 12644 TradeRecordList (21).csv
-a---- 2022/11/26 2:08 12633 TradeRecordList (22).csv
-a---- 2022/11/26 2:08 12637 TradeRecordList (23).csv
-a---- 2022/11/26 2:08 12588 TradeRecordList (24).csv
-a---- 2022/11/26 2:08 12486 TradeRecordList (25).csv
-a---- 2022/12/07 11:30 11714 TradeRecordList (26).csv
PS >Get-Item Trade*.csv | Rename-Item -NewName { $_.Name -replace ' ','' }
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/11/26 2:07 5511 TradeRecordList(12).csv
-a---- 2022/10/16 22:44 12510 TradeRecordList(13).csv
-a---- 2022/10/16 22:44 12637 TradeRecordList(14).csv
-a---- 2022/10/16 22:44 12536 TradeRecordList(15).csv
-a---- 2022/10/16 22:45 12512 TradeRecordList(16).csv
-a---- 2022/10/16 22:45 12513 TradeRecordList(17).csv
-a---- 2022/10/16 22:47 7502 TradeRecordList(18).csv
-a---- 2022/11/26 2:09 5517 TradeRecordList(20).csv
-a---- 2022/11/26 2:09 12644 TradeRecordList(21).csv
-a---- 2022/11/26 2:08 12633 TradeRecordList(22).csv
-a---- 2022/11/26 2:08 12637 TradeRecordList(23).csv
-a---- 2022/11/26 2:08 12588 TradeRecordList(24).csv
-a---- 2022/11/26 2:08 12486 TradeRecordList(25).csv
-a---- 2022/12/07 11:30 11714 TradeRecordList(26).csv
アイテム名に特殊文字 Squire Brackets [] があるときは、.Replace(“`[","").Replace("
`]”,””) で取り除けます。
PS >ls climax*
ディレクトリ: W:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2021/09/16 9:36 CLIMAX BEST 歌謡曲 [ Disk 1 ]
d----- 2021/09/16 9:36 CLIMAX Best 歌謡曲 [ Disk 2 ]
PS >Get-Item CLIMAX* | Rename-Item -NewName { $_.Name.Replace("`[","").Replace("`]","") }
PS >ls climax*
ディレクトリ: W:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2021/09/16 9:36 CLIMAX BEST 歌謡曲 Disk 1
d----- 2021/09/16 9:36 CLIMAX Best 歌謡曲 Disk 2
ForEach-Object 各入力オブジェクトに対して操作を実行する
エイリアスは、 % です。
ForEach-Object は、各入力オブジェクト毎にスクリプト・ブロックで指示された操作を実行します。
以下の例では、文字列を “,” で区切って ForEach-Object でそれぞれの3文字目からを抽出しています。
PS C:\PS_work> "1 Apple,2 Banana,3 Strawberry,4 Orange,5 Cherry" -Split ","
1 Apple
2 Banana
3 Strawberry
4 Orange
5 Cherry
PS C:\PS_work> "1 Apple,2 Banana,3 Strawberry,4 Orange,5 Cherry" -Split "," | ForEach-Object { $_.Substring(2) }
Apple
Banana
Strawberry
Orange
Cherry
ForEach-Object では複数のスクリプト・ブロックを実行します。最初のスクリプトブロック { ‘begin’ }は、一番最初だけ実行、最後の { ‘end’ } は、最後だけ実行され、間のスクリプト・ブロックは毎回実行されます。
PS C:\PS_work> 1..10 | ForEach-Object { 'begin' } { "$_" + 'process1' } {"$_" + "process2"} { 'end' }
begin
1process1
1process2
2process1
2process2
3process1
3process2
4process1
4process2
5process1
5process2
6process1
6process2
7process1
7process2
8process1
8process2
9process1
9process2
10process1
10process2
end
Format-List オブジェクトのプロパティをリスト形式で表示する
エイリアスは、 fl です。
Format-List は、オブジェクト形式の入力をプロパティごとにリストします。
PowerShell のコマンドレットの出力は、殆どの場合がオブジェクトです。オブジェクト形式の出力をパイプラインで受け取ってオブジェクトのプロパティのリストを表示します。
次の例では Get-ChildItem の出力をリスト形式で表示しています。
PS C:\PS_work\work1> Get-ChildItem
ディレクトリ: C:\PS_work\work1
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/11/11 12:20 2 test.log
-a---- 2022/11/10 15:53 72 test.txt
PS C:\PS_work\work1> Get-ChildItem | Format-List
ディレクトリ: C:\PS_work\work1
Name : test.log
Length : 2
CreationTime : 2022/11/11 12:20:50
LastWriteTime : 2022/11/11 12:20:50
LastAccessTime : 2022/11/11 12:20:50
Mode : -a----
LinkType :
InternalName:
OriginalFilename:
FileVersion:
FileDescription:
Product:
ProductVersion:
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language:
Name : test.txt
Length : 72
CreationTime : 2022/11/10 16:07:33
LastWriteTime : 2022/11/10 15:53:59
LastAccessTime : 2022/11/10 16:07:33
Mode : -a----
LinkType :
Target : {}
VersionInfo : File: C:\PS_work\work1\test.txt
InternalName:
OriginalFilename:
FileVersion:
FileDescription:
Product:
ProductVersion:
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language:
Select-Object オブジェクト、オブジェクトのプロパティ を選択する
エイリアスは、select です。
Select-Object は、オブジェクト、またはオブジェクトのプロパティを選択します。
-Property プロパティを指定して選択します。 次の例では、Select-String の出力には先頭にファイル名、行番号が出ています。ここから Select-Object -Property Line でプロパティの Line だけを選択しています。
PS C:\PS_work> Select-String -Pattern ABC -Path .\test*.txt
test.txt:1:abcdefg,ABC,123,12345
test1.txt:1:This is test1 0 AAAA3,ABC,123,12345
Test1Copy.txt:1:This is test1 0 AAAA3,ABC,123,12345
Test1Copy.txt:5:This is test2 0 AAAA3,ABC,123,12345
test2.txt:1:This is test2 0 AAAA3,ABC,123,12345
test3.txt:1:This is test3 0 AAAA3,ABC,123,12345
test4.txt:1:This is test4 0 AAAA3,ABC,123,12345
PS C:\PS_work> Select-String -Pattern ABC -Path .\test*.txt | Select-Object -Property Line
Line
----
abcdefg,ABC,123,12345
This is test1 0 AAAA3,ABC,123,12345
This is test1 0 AAAA3,ABC,123,12345
This is test2 0 AAAA3,ABC,123,12345
This is test2 0 AAAA3,ABC,123,12345
This is test3 0 AAAA3,ABC,123,12345
This is test4 0 AAAA3,ABC,123,12345
-First , -Last 先頭または末尾から取得するオブジェクトの数を指定できます。
PS C:\PS_work> Select-String -Pattern ABC -Path .\test*.txt | Select-Object -First 3
test.txt:1:abcdefg,ABC,123,12345
test1.txt:1:This is test1 0 AAAA3,ABC,123,12345
Test1Copy.txt:1:This is test1 0 AAAA3,ABC,123,12345
PS C:\PS_work> Select-String -Pattern ABC -Path .\test*.txt | Select-Object -Last 3
test2.txt:1:This is test2 0 AAAA3,ABC,123,12345
test3.txt:1:This is test3 0 AAAA3,ABC,123,12345
test4.txt:1:This is test4 0 AAAA3,ABC,123,12345
-Skip 先頭から除外したいオブジェクトの数を指定できます。
PS C:\PS_work> Select-String -Pattern ABC -Path .\test*.txt | Select-Object -Property Line -Skip 1
Line
----
This is test1 0 AAAA3,ABC,123,12345
This is test1 0 AAAA3,ABC,123,12345
This is test2 0 AAAA3,ABC,123,12345
This is test2 0 AAAA3,ABC,123,12345
This is test3 0 AAAA3,ABC,123,12345
This is test4 0 AAAA3,ABC,123,12345
-Index インデックスで指定したオブジェクトだけ選択します。インデックスは、0から始まります。
PS C:\PS_work> Select-String -Pattern ABC -Path .\test*.txt | Select-Object -Property Line
Line
----
abcdefg,ABC,123,12345
This is test1 0 AAAA3,ABC,123,12345
This is test1 0 AAAA3,ABC,123,12345
This is test2 0 AAAA3,ABC,123,12345
This is test2 0 AAAA3,ABC,123,12345
This is test3 0 AAAA3,ABC,123,12345
This is test4 0 AAAA3,ABC,123,12345
PS C:\PS_work> Select-String -Pattern ABC -Path .\test*.txt | Select-Object -Property Line | Select-Object -Index 0,3
Line
----
abcdefg,ABC,123,12345
This is test2 0 AAAA3,ABC,123,12345
Sort-Object オブジェクトのプロパティの値でオブジェクトを並べ変える
簡単なアンケートに答えるだけでポイントが貯まる!貯まったポイントは現金や電子マネーに交換可能♪
エイリアスは、 sort です。
Sort-Object は、指定されたプロパティの値でオブジェクトを並び変えます。
-Property プロパティを指定します。次の例では、Get-ChildItem でディレクトリの内容を取得し、プロパティ Length で並び変えて容量の少ない順に表示しています。-Property は省略できます。
PS C:\ps_work> Get-ChildItem | Sort-Object -Property Length
ディレクトリ: C:\ps_work
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/11/11 10:30 18 TestDesu.txt
-a---- 2022/11/11 0:40 32 KanjiCopy.txt
-a---- 2022/11/11 10:17 34 kanjiTest.txt
-a---- 2022/11/10 15:53 72 test.txt
-a---- 2022/11/10 18:52 158 test1.txt
-a---- 2022/11/10 19:12 158 test2.txt
-a---- 2022/11/10 23:07 306 test3.txt
-a---- 2022/11/10 23:21 311 test4.txt
-a---- 2022/11/11 0:17 634 Test1Copy.txt
-a---- 2022/11/11 22:36 1455 Get-MP3MetaData.ps1
d----- 2022/11/11 12:20 work1
d----- 2022/11/10 16:07 work3
d----- 2022/11/10 16:07 work2
次の例では、ファイルの内容を並べ変え表示しています。
PS C:\ps_work> Get-Content TestSort.txt
ZZZZZZZZZZZZZZ
SSSSSSSSSSSSSS
AAAAAAAAAAAAAA
DDDDDDDDDDDDDDD
KKKKKKKKKKKKKK
UUUUUUUUUUUUUUU
BBBBBBBBBBBBBB
qqqqqqqqqqqqqq
wwwwwwwwwwwwww
dddddddddddddd
wwwwwwwwwwWWWW
PS C:\ps_work> Get-Content TestSort.txt | Sort-Object
AAAAAAAAAAAAAA
BBBBBBBBBBBBBB
dddddddddddddd
DDDDDDDDDDDDDDD
KKKKKKKKKKKKKK
qqqqqqqqqqqqqq
SSSSSSSSSSSSSS
UUUUUUUUUUUUUUU
wwwwwwwwwwwwww
wwwwwwwwwwWWWW
ZZZZZZZZZZZZZZ
-Descending 降順に並び変えます。
PS C:\ps_work> Get-ChildItem | Sort-Object Length -Descending
ディレクトリ: C:\ps_work
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/11/11 22:36 1455 Get-MP3MetaData.ps1
-a---- 2022/11/11 0:17 634 Test1Copy.txt
-a---- 2022/11/10 23:21 311 test4.txt
-a---- 2022/11/10 23:07 306 test3.txt
-a---- 2022/11/10 19:12 158 test2.txt
-a---- 2022/11/10 18:52 158 test1.txt
-a---- 2022/11/10 15:53 72 test.txt
-a---- 2022/11/11 10:17 34 kanjiTest.txt
-a---- 2022/11/11 0:40 32 KanjiCopy.txt
-a---- 2022/11/11 10:30 18 TestDesu.txt
d----- 2022/11/11 12:20 work1
d----- 2022/11/10 16:07 work2
d----- 2022/11/10 16:07 work3
-Unique ソートした結果から重複を排除します。
PS C:\ps_work> Get-Content TestSort2.txt
bbbbbbbbb1
AAAAAAAAA2
AAAAAAAAA1
BBBBBBBBB1
ccccccccc1
CCCCCCCCC1
AAAAAAAAA1
aaaaaaaaa2
PS C:\ps_work> Get-Content TestSort2.txt | Sort-Object -Unique
AAAAAAAAA1
aaaaaaaaa2
bbbbbbbbb1
CCCCCCCCC1
-CaseSensitive 大文字・小文字を区別します。
PS C:\ps_work> Get-Content TestSort2.txt | Sort-Object -Unique
AAAAAAAAA1
aaaaaaaaa2
bbbbbbbbb1
CCCCCCCCC1
PS C:\ps_work> Get-Content TestSort2.txt | Sort-Object -Unique -CaseSensitive
AAAAAAAAA1
aaaaaaaaa2
AAAAAAAAA2
bbbbbbbbb1
BBBBBBBBB1
ccccccccc1
CCCCCCCCC1
Set-ExecutionPolicy スクリプトの実行ポリシーを変更する
PowerShell のスクリプトは、実行ポリシーにより実行出来るかどうかが決められています。実行ポリシーを設定していない状態では、通常、Undefined の状態です。 Undefined は Restricted と判断され、スクリプトは実行出来ません。
次の例は、実行ポリシーがUndefinedの状態でスクリプトを実行しようとした時の結果です。
PS C:\ps_work> ./Get-MP3MetaData.ps1 w:\Carpenters | select -f 1
./Get-MP3MetaData.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\ps_work\Get-MP3MetaData.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microso
ft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ ./Get-MP3MetaData.ps1 w:\Carpenters | select -f 1
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
現状の実行ポリシーは、 Get-ExecutionPolicy -List で知ることが出来ます。
PS C:\ps_work> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Undefined
実行ポリシーには、次の種類があります。
- Unrestricted
- RemoteSigned
- AllSigned
- Restricted
- Default
- Bypass
- Undefined
実行ポリシーの変更は、PowerShellを管理者として実行し、 Set-ExecutionPolicy コマンドレットで設定します。
実行ポリシー Unrestricted
すべてのスクリプトを実行します。インターネットからダウンロードしたスクリプト、リモートコンピュータにあるスクリプトを実行する時は警告プロンプトがでます。
PS C:\WINDOWS\system32> Set-ExecutionPolicy Unrestricted
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y
PS C:\WINDOWS\system32> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Unrestricted
次の例は、GitHubから入手したMP3のメタデータを取得するスクリプトの実行結果です。
./Get-MP3Metadata_LocalMade.ps1 は、ダウンロードしたスクリプトからマニュアルで行をコピーしたローカルメイドのスクリプトです。
.\work1/Get-MP3Metadata.ps1 は、ダウンロードしたままのスクリプトです。
W:\Get-MP3MetaData_LocalMade.ps1 ドライブ W: は自宅設置のNASコンピュータです。
これらのスクリプトにはどれもデジタル署名はされていません。
次の例では、ローカルで作ったスクリプトは何も警告なしで実行されています。
PS C:\ps_work> ./Get-MP3Metadata_LocalMade.ps1 w:\carpenters | select -f 1
アルバム : TWENTY-TWO HITS OF THE CARPENTERS
タイトル : I NEED TO BE IN LOVE
名前 : 01 I NEED TO BE IN LOVE.mp3
サイズ : 3.51 MB
参加アーティスト : THE CARPENTERS
年 : 1995
長さ : 00:03:50
ビット レート : 128kbps
評価 : 評価なし
ジャンル : Pop
作成者 : THE CARPENTERS
項目の種類 : MP3 ファイル
Directory : w:\carpenters
Fullname : W:\carpenters\01 I NEED TO BE IN LOVE.mp3
Extension : .mp3
インターネットからダウンロードしたスクリプトは、実行前に警告がでます。
PS C:\ps_work> .\work1/Get-MP3Metadata.ps1 w:\carpenters | select -f 1
セキュリティ警告
信頼するスクリプトのみを実行してください。インターネットから入手したスクリプトは便利ですが、コンピューターに危害を及ぼす可能性があります。このスクリプトを信頼する場合は、この警告メッセージが表示さ
れないように、Unblock-File コマンドレットを使用して、スクリプトの実行を許可してください。C:\ps_work\work1\Get-MP3MetaData.ps1 を実行しますか?
[D] 実行しない(D) [R] 一度だけ実行する(R) [S] 中断(S) [?] ヘルプ (既定値は "D"): R
アルバム : TWENTY-TWO HITS OF THE CARPENTERS
タイトル : I NEED TO BE IN LOVE
名前 : 01 I NEED TO BE IN LOVE.mp3
サイズ : 3.51 MB
参加アーティスト : THE CARPENTERS
年 : 1995
長さ : 00:03:50
ビット レート : 128kbps
評価 : 評価なし
ジャンル : Pop
作成者 : THE CARPENTERS
項目の種類 : MP3 ファイル
Directory : w:\carpenters
Fullname : W:\carpenters\01 I NEED TO BE IN LOVE.mp3
Extension : .mp3
リモートに置いたスクリプトは、実行前に警告が出ます。
PS C:\ps_work> W:\Get-MP3MetaData_LocalMade.ps1 w:\carpenters | select -f 1
セキュリティ警告
信頼するスクリプトのみを実行してください。インターネットから入手したスクリプトは便利ですが、コンピューターに危害を及ぼす可能性があります。このスクリプトを信頼する場合は、この警告メッセージが表示さ
れないように、Unblock-File コマンドレットを使用して、スクリプトの実行を許可してください。W:\Get-MP3MetaData_LocalMade.ps1 を実行しますか?
[D] 実行しない(D) [R] 一度だけ実行する(R) [S] 中断(S) [?] ヘルプ (既定値は "D"): R
アルバム : TWENTY-TWO HITS OF THE CARPENTERS
タイトル : I NEED TO BE IN LOVE
名前 : 01 I NEED TO BE IN LOVE.mp3
サイズ : 3.51 MB
参加アーティスト : THE CARPENTERS
年 : 1995
長さ : 00:03:50
ビット レート : 128kbps
評価 : 評価なし
ジャンル : Pop
作成者 : THE CARPENTERS
項目の種類 : MP3 ファイル
Directory : w:\carpenters
Fullname : W:\carpenters\01 I NEED TO BE IN LOVE.mp3
Extension : .mp3
Unblock-File インターネットからダウンロードされたファイルのブロックを解除する
会員数は国内最大級の180万人を突破!【paters】Unblock-File でブロックを解除すると警告が出なくなります。
PS C:\ps_work> Unblock-File .\work1\Get-MP3MetaData.ps1
PS C:\ps_work> .\work1/Get-MP3Metadata.ps1 w:\carpenters | select -f 1
アルバム : TWENTY-TWO HITS OF THE CARPENTERS
タイトル : I NEED TO BE IN LOVE
名前 : 01 I NEED TO BE IN LOVE.mp3
サイズ : 3.51 MB
参加アーティスト : THE CARPENTERS
年 : 1995
長さ : 00:03:50
ビット レート : 128kbps
評価 : 評価なし
ジャンル : Pop
作成者 : THE CARPENTERS
項目の種類 : MP3 ファイル
Directory : w:\carpenters
Fullname : W:\carpenters\01 I NEED TO BE IN LOVE.mp3
Extension : .mp3
実行ポリシー RemoteSigned
リモートコンピュータにあるスクリプトはデジタル署名されている必要があります。インターネットからダウンロードしたスクリプトもデジタル署名されている必要があります。ローカルにあるスクリプトは実行できます。
PS C:\WINDOWS\system32> Set-ExecutionPolicy RemoteSigned
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y
PS C:\WINDOWS\system32> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine RemoteSigned
ローカルで作ったローカルコンピュータにあるスクリプトは実行できます。
PS C:\ps_work> ./Get-MP3Metadata_LocalMade.ps1 w:\carpenters | select -f 1
アルバム : TWENTY-TWO HITS OF THE CARPENTERS
タイトル : I NEED TO BE IN LOVE
名前 : 01 I NEED TO BE IN LOVE.mp3
サイズ : 3.51 MB
参加アーティスト : THE CARPENTERS
年 : 1995
長さ : 00:03:50
ビット レート : 128kbps
評価 : 評価なし
ジャンル : Pop
作成者 : THE CARPENTERS
項目の種類 : MP3 ファイル
Directory : w:\carpenters
Fullname : W:\carpenters\01 I NEED TO BE IN LOVE.mp3
Extension : .mp3
インターネットからダウンロードしたスクリプトでデジタル署名されていないものは実行できません。
PS C:\ps_work> .\work1/Get-MP3Metadata.ps1 w:\carpenters | select -f 1
.\work1/Get-MP3Metadata.ps1 : ファイル C:\ps_work\work1\Get-MP3MetaData.ps1 を読み込めません。ファイル C:\ps_work\work1\Get-MP3MetaData.ps1 はデジタル署名されていません。このスクリプトは現在のシス
テムでは実行できません。スクリプトの実行および実行ポリシーの設定の詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\work1/Get-MP3Metadata.ps1 w:\carpenters | select -f 1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
インターネットからダウンロードして Unblock-File でブロック解除したものは実行できます。
PS C:\ps_work> Unblock-File .\work1\Get-MP3MetaData.ps1
PS C:\ps_work> .\work1/Get-MP3Metadata.ps1 w:\carpenters | select -f 1
アルバム : TWENTY-TWO HITS OF THE CARPENTERS
タイトル : I NEED TO BE IN LOVE
名前 : 01 I NEED TO BE IN LOVE.mp3
サイズ : 3.51 MB
参加アーティスト : THE CARPENTERS
年 : 1995
長さ : 00:03:50
ビット レート : 128kbps
評価 : 評価なし
ジャンル : Pop
作成者 : THE CARPENTERS
項目の種類 : MP3 ファイル
Directory : w:\carpenters
Fullname : W:\carpenters\01 I NEED TO BE IN LOVE.mp3
Extension : .mp3
リモートにあるスクリプトは、デジタル署名がなければ実行されません。
PS C:\ps_work> W:\Get-MP3MetaData_LocalMade.ps1 w:\carpenters | select -f 1
W:\Get-MP3MetaData_LocalMade.ps1 : ファイル W:\Get-MP3MetaData_LocalMade.ps1 を読み込めません。ファイル W:\Get-MP3MetaData_LocalMade.ps1 はデジタル署名されていません。このスクリプトは現在のシステム
では実行できません。スクリプトの実行および実行ポリシーの設定の詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ W:\Get-MP3MetaData_LocalMade.ps1 w:\carpenters | select -f 1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
実行ポリシー AllSigned
すべてのスクリプトは、デジタル署名がされている必要があります。
PS C:\WINDOWS\system32> Set-ExecutionPolicy AllSigned
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y
PS C:\WINDOWS\system32> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine AllSigned
ローカルにあっても、Unblock-File されていても、デジタル署名のないものは実行出来ません。
PS C:\ps_work> ./Get-MP3Metadata_LocalMade.ps1 w:\carpenters | select -f 1
./Get-MP3Metadata_LocalMade.ps1 : ファイル C:\ps_work\Get-MP3MetaData_LocalMade.ps1 を読み込めません。ファイル C:\ps_work\Get-MP3MetaData_LocalMade.ps1 はデジタル署名されていません。このスクリプト
は現在のシステムでは実行できません。スクリプトの実行および実行ポリシーの設定の詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ ./Get-MP3Metadata_LocalMade.ps1 w:\carpenters | select -f 1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
PS C:\ps_work> .\work1/Get-MP3Metadata.ps1 w:\carpenters | select -f 1
.\work1/Get-MP3Metadata.ps1 : ファイル C:\ps_work\work1\Get-MP3MetaData.ps1 を読み込めません。ファイル C:\ps_work\work1\Get-MP3MetaData.ps1 はデジタル署名されていません。このスクリプトは現在のシス
テムでは実行できません。スクリプトの実行および実行ポリシーの設定の詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\work1/Get-MP3Metadata.ps1 w:\carpenters | select -f 1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
PS C:\ps_work> W:\Get-MP3MetaData_LocalMade.ps1 w:\carpenters | select -f 1
W:\Get-MP3MetaData_LocalMade.ps1 : ファイル W:\Get-MP3MetaData_LocalMade.ps1 を読み込めません。ファイル W:\Get-MP3MetaData_LocalMade.ps1 はデジタル署名されていません。このスクリプトは現在のシステム
では実行できません。スクリプトの実行および実行ポリシーの設定の詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ W:\Get-MP3MetaData_LocalMade.ps1 w:\carpenters | select -f 1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
デジタル署名の仕方
スクリプトの署名方法については、こちらに書かれていますが、ちょっと工夫しないとうまく行きません。
自己署名証明書の作成
前述のマイクロソフトのリンク先の自己証明書の作成を行います。PowerShell のコンソールで次のテキストをキーインします。
$params = @{
Subject = 'CN=PowerShell Code Signing Cert'
Type = 'CodeSigning'
CertStoreLocation = 'Cert:\CurrentUser\My'
HashAlgorithm = 'sha256'
}
$cert = New-SelfSignedCertificate @params
自己証明書が出来たかどうかを次のコマンドで確認します。
PS C:\WINDOWS\system32> Get-ChildItem cert:\CurrentUser\my -codesigning
PSParentPath: Microsoft.PowerShell.Security\Certificate::CurrentUser\my
Thumbprint Subject
---------- -------
E9CFE893468A1BB65575A084D4F5978A4B95D866 CN=PowerShell Code Signing Cert
署名用スクリプトの記述
エディターで次のコードを記述して、 Add-Signature.ps1 というファイル名で UTF8 BOM無しのエンコードで保存します。
## Signs a file
param([string] $file=$(throw "Please specify a filename."))
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature $file $cert
Add-Signature.ps1 に署名する
作成したスクリプト・ファイル ‘Add-Signature.ps1’ に署名するため、次のコマンドを入れます。
PS C:\PS_work> $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
PS C:\PS_work> Set-AuthenticodeSignature add-signature.ps1 $cert
ディレクトリ: C:\PS_work
SignerCertificate Status Path
----------------- ------ ----
E9CFE893468A1BB65575A084D4F5978A4B95D866 UnknownError add-signature.ps1
マイクロソフトのページでは、これでうまく行くように記述されていますが、実際はご覧のように Status UnknownError になってしまいます。
add-signature.ps1 を実行しようとすると、次の様なエラーになります。
PS C:\PS_work> ./add-signature.ps1
./add-signature.ps1 : ファイル C:\PS_work\Add-Signature.ps1 を読み込めません。証明書チェーンは処理されましたが、信頼プロバイダーが信頼していないルー
ト証明書で強制終了しました。。
発生場所 行:1 文字:1
+ ./add-signature.ps1
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
証明書チェーンは処理されましたが、信頼プロバイダーが信頼していないルート証明書で強制終了しました。。
こうなった場合は、次の処理が必要です。
作成した自己証明書を移動する
コマンド窓に ’証明書の管理’ と入れて出てきた ユーザー証明書の管理 をクリックします。
個人 – 証明書 の中の “PowerShell Code Signing Cert” を選択してマウスの右クリック -> 切り取り(T) をクリックします。
信頼されたルート証明機関 – 証明書 に 貼り付け(P) ます。
信頼されたルート証明機関 – 証明書 の中に入ったことを確認します。