プログラミングのすすめ 第十一歩 Windows PowerShell リファレンス

プログラミング

プログラミングのすすめ 第十歩で始めた Windows PowerShell ですが、前回で分かったように Windows PowerShell はかなり高度です。プログラミングのすすめ 第六歩で、VBで作ったグラフ用データ作成プログラムも プログラミングのすすめ 第七歩のHTMLファイルの作成も PowerShell だけで代替することが出来ました。

今回は PowerShell でよく使われるコマンドレットや、メソッド、関数、演算子 等々を実際に実行しながら分かり易くまとめて行きたいと思います。

会員数は国内最大級の180万人を突破!【paters】
  1. よく使うコマンドレット
    1. Get-Content ファイルの内容を取得する
    2. Get-Date 現在の日付と時刻を取得する
    3. Select-String ファイル内のテキストを検索する
    4. Set-Location 現在の作業場所を指定された場所に設定します。
    5. Out-String 入力オブジェクトをストリングに変換する
    6. Out-File ファイルに書き出す
    7. Write-OutPut パイプラインに書き込む、コンソールに書き込む
    8. Add-Content ファイルに追加する
    9. Get-ChildItem ディレクトリの内容を取得する
    10. Rename-Item Itemの名前を変更する
    11. ForEach-Object 各入力オブジェクトに対して操作を実行する
    12. Format-List オブジェクトのプロパティをリスト形式で表示する
    13. Select-Object オブジェクト、オブジェクトのプロパティ を選択する
    14. Sort-Object オブジェクトのプロパティの値でオブジェクトを並べ変える
    15. Set-ExecutionPolicy スクリプトの実行ポリシーを変更する
      1. 実行ポリシー Unrestricted
        1. Unblock-File インターネットからダウンロードされたファイルのブロックを解除する
      2. 実行ポリシー RemoteSigned
      3. 実行ポリシー AllSigned
        1. デジタル署名の仕方
          1. 自己署名証明書の作成
          2. 署名用スクリプトの記述
          3. Add-Signature.ps1 に署名する
          4. 作成した自己証明書を移動する
          5. PowerShell から証明書を確認
          6. 信頼されたルート証明機関に移動した PowerShell Cord Signing Cert で署名する
      4. 実行ポリシー Restricted
      5. 実行ポリシー Default
      6. 実行ポリシー Bypass
      7. 実行ポリシー Undefined
    16. Test-Path ファイルの存在を調べる
  2. よく使う関数、演算子、メソッド
    1. PowerShell のプロンプトの変更
    2. Profile.PS1 の記述
    3. Substring メソッド 文字列から部分文字列の抽出
    4. $() 部分式演算子
    5. Split 演算子 文字列を分割する
    6. Count 演算子
    7. Replace 置換演算子
    8. .. 範囲演算子
    9. 配列変数の定義
    10. マルチ・ディメンジョンの配列
    11. ToCharArray() メソッド 文字列を一文字づつ配列に代入
  3. 応用編、およびスクリプト
    1. CSV ファイルのある条件の行を抽出する
    2. 与えられた期間指定の日付を判定するスクリプト
    3. PowerShell から他のアプリケーションを実行する
    4. 実行されているPowerShellが管理者で実行されているかを外部から調べる
    5. Visual Basic でPowerShell を使う

よく使うコマンドレット

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 桁
yyyy4 桁の形式の年
HH:mm24 時間形式の時刻 -秒なし
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) ます。

信頼されたルート証明機関 – 証明書 の中に入ったことを確認します。

PowerShell から証明書を確認