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 サクラエディタ.lnkPS 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