2020年10月21日水曜日

powershellでgrep → Select-String "xxxx"

 AzureのTemplate.jsonでこんな行があった。

"commandToExecute": "powershell.exe Install-WindowsFeature -name Web-Server -IncludeManagementTools && powershell.exe ~~~

PowerShellからIISの役割と管理ツールをインストールしているっぽい。


手持ちのWindows10端末でPowerShellを起動して実行するとエラー。

PS C:\Users\lydian> Install-WindowsFeature

Install-WindowsFeature : 用語 'Install-WindowsFeature' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。

VMのWindowsServer2016で試しても同じエラー。
よくよく確認すると、Windows10とPowerShell(x86)では動作しないことがわかった。。

で、WindowsServer2016のPowerShellで再度確認。

PS C:\Users\Administrator\Desktop> Install-WindowsFeature -name Web-Server
Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    No             NoChangeNeeded {}

一応、それらしい応答があった。この「-name」が何かが気になったので調べた。

役割、役割サービス、または機能のインストールまたはアンインストール | Microsoft Docs

ローカル サーバーにインストール済みの利用可能な役割と機能の一覧を表示するには、「Get-WindowsFeature」と入力し、Enter キーを押します。

次にこの「Get-WindowsFeature」を試す。

PS C:\Users\Administrator> Get-WindowsFeature
Display Name                                            Name                       Install State
------------                                            ----                       -------------
[ ] Active Directory Federation Services                ADFS-Federation                Available
[ ] Active Directory Rights Management サービス         ADRMS                          Available
    [ ] Active Directory Rights Management サーバー     ADRMS-Server                   Available
    [ ] ID フェデレーション サポート                    ADRMS-Identity                 Available

こんな感じでズラズラ表示された。よくよく探すと
「[X] Web サーバー (IIS)                                  Web-Server                     Installed」
の行もあった。

長い行から目視で探すのも大変なので、これをgrepみたいにして探したいなと思ったのが始まり。

*** --- *** --- *** --- ***

PowerShellにはgrepの仕組みは無いようで、代わりに「Select-String "文字"」を使うらしい。
なので、「Get-WindowsFeature | Select-String "Web-Server"」としても結果は無しだった。。

「Get-WindowsFeature」に使えるものかがわからないので、代わりに「dir」と組み合わせて確認した。

PS C:\Users\Administrator> dir
    ディレクトリ: C:\Users\Administrator
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-r---       2020/07/30     17:26                Contacts
d-r---       2020/07/30     17:26                Desktop
d-r---       2020/07/30     17:26                Documents
d-r---       2020/07/30     17:26                Downloads
d-r---       2020/07/30     17:26                Favorites
d-r---       2020/07/30     17:26                Links
d-r---       2020/07/30     17:26                Music
d-r---       2020/07/30     17:26                Pictures
d-r---       2020/07/30     17:26                Saved Games
d-r---       2020/07/30     17:26                SearchesPS
C:\Users\Administrator> dir | Select-String "Links"
Links

 これはOK。つぎは

PS C:\Users\Administrator> dir | Select-String "es"
Desktop
Favorites
Pictures
Saved Games
Searches

と、検索文字が含まれると複数マッチすることもわかった。
日本語の場合は?

PS C:\Users\Administrator\Desktop> dir
    ディレクトリ: C:\Users\Administrator\Desktop
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2020/05/22      9:46                sakura-tag-v2.4.0-bui
d-----       2020/05/22     11:54                共有フォルダ
-a----       2020/05/22     15:59         179676 ASP.NET4.6.PNG
-a----       2020/05/22      9:47           1008 サクラエディタ.lnk

PS C:\Users\Administrator\Desktop> dir | Select-String "サクラ"
PS C:\Users\Administrator\Desktop>


日本語だとNGになった。「powershell dir select-string」でググると、

【連載】PowerShell Core入門 - 基本コマンドの使い方 [8] 文字列の一致検索 Select-String、Out-String|サーバ/ストレージ|IT製品の事例・解説記事

Out-Stringというコマンドレットに-Streamというオプションを指定すると、表示されているテキストを行単位で処理させることができるようになる。次のように見た目は一緒だが、出力されるテキストがそのままオブジェクトとして扱われるように変わっている。
Out-String -Streamを利用すると出力された文字列を対象とすることができる

という説明があって、このコマンドをdirにパイプでつなげればうまくいきそうな気がした。

PS C:\Users\Administrator\Desktop> dir | Out-String -Stream | Select-String "サクラ"
-a----       2020/05/22      9:47           1008 サクラエディタ.lnk

うまくいった!これで同じく「Get-WindowsFeature」にもできそう。

PS C:\Users\Administrator\Desktop> Get-WindowsFeature | Out-String -Stream | Select-String "Web-Server"
[X] Web サーバー (IIS)                                      Web-Server                     Installed

いけた!!

*** --- *** --- *** --- ***

同じような質問が解決した後に見つかったので、ついでに投稿しておいたw

PowerShell Select-String matches nothing despite trying everything in TFM - Stack Overflow


0 件のコメント:

コメントを投稿