1年くらい前から開発と構築(のド素人)に配属変わりました。
日々慣れないことの連続でホゲェーってなってますがまぁ死にはしないので頑張りましょう(げそ

今日のお題目です。

  • WindowsPowerShellを導入してみる

からの、注意事項ですがコマンドプロンプトで出来ることはPowershellで全てできます。コマンドも全て所有しています。余裕があればCMDは全部PowerShellに置き換えて良いと思いますが、細かい所で出力結果と挙動が違うので検証的な意味でも単純置き換えは相当難しいでしょう。
dirコマンドを入れた場合分かりやすく顕著かと思います。



サーバに入れて使うことを前提にしてるのでだいたいは導入有無判断からスタートです。
あまりにも古いServerで無い限りデフォルトでWindowsPowerShellが入っているのでアップデートする必要はありません。
ただAzurePowerShellを使う場合7.xが必要だったりするので、アップデートしておいた方が根本的には対応楽です。
WindowsPowerShellのバージョンを上げずにAzurePowerShellを使わせろとなった場合.Net Frameworkを更新しないといけない場合もあり、調整がクソ面倒になります。

余談ですがWindowsUpdateで.Net Frameworkが勝手に更新された場合、開発アプリが動かなくなる等があるのでバージョン変動には本当気を配る必要があります。企業製品のバージョンがいつまでも古いのは動かない原因を探す、対応するが面倒な点もあるので致し方ない所ですね。


WindowsPowerShellの最新版はGithubにあります。
余程の事が無い限りプレビュー版を使うのはやめておきましょう。
開発途上にありがちなバグが入ってたらどうするんだ?となります。


大抵のWindows環境であれば執筆時点で「PowerShell-7.1.3-win-x64.msi」が適合すると思います。
余程の事情が無い限りOSの最大bit数に合わせたVerで良いと思います。
64bitOSに32bitアプリを入れるのは殆どの場合、納品時の説明で「無用な何故?」の質問を招くのでオススメできません。

GITHUB|WINDOWS POWERSHELL
https://github.com/PowerShell/powershell/releases

インストール方法はダウンロードしたインストーラをそのまま実行すればOKです。
ただし「数百台のパソコンにまとめてインストールさせる」ような特殊な事例がある場合は、MSサイトのサイレントインストールコマンドを応用すると良いと思います。
手法は玉石混交だと思うので次の機会にでも。




実は初期環境では殆ど何も動きません。
原因はセキュリティレベルによる動作停止です。

WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する
https://www.atmarkit.co.jp/ait/articles/0805/16/news139.html

大抵Restrictedになっており躓くと思います。
企業のノウハウって意外とこういう初動が抜けてる事が多いです。

次。

このBlog書いてる時点でも漠然と何学べば良いか分からない状態なのでサンプルを探します。
色々と有ると思いますが、企業人としては大抵はログ取得辺りで難儀するのではないでしょうか。
あと、引き算割り算は良いんですが構文としてよく見るのはfunctionでコレがいまいち分かりませんのでまずこれから。

Windows PowerShell 入門(6)−関数編1
https://codezine.jp/article/detail/2491

というわけでコードを作った。

PS C:\WINDOWS\system32> function hello { write-host "hello powershell world!!" }
PS C:\WINDOWS\system32> hello
hello powershell world!!
PS C:\WINDOWS\system32>


ワイの中の理解ではこう

function 関数呼び出し用文字 { コード } と組む事で必要な時に呼び出しが可能になる。
で、ps1で作ったコードの中は

function 関数呼び出し用文字1 { コード }
function 関数呼び出し用文字2 { コード }
function 関数呼び出し用文字3 { コード }

みたいな塊で作られてて
ps1を単体で読み込んだだけでは実行されないように作る。
そうしないとps1読んだ時点で直列に動作しちゃうからね。

なのでお遊びコードを作った

function hello { write-host "hello powershell world!!" }
function enl { write-host "青は灰に" }
function res { write-host "緑は塵に" }

powershellに直接読ませて使った結果はコレである

PS C:\WINDOWS\system32> function hello { write-host "hello powershell world!!" }
PS C:\WINDOWS\system32> function enl { write-host "青は灰に" }
PS C:\WINDOWS\system32> function res { write-host "緑は塵に" }
PS C:\WINDOWS\system32> hello
hello powershell world!!
PS C:\WINDOWS\system32> enl
青は灰に
PS C:\WINDOWS\system32> res
緑は塵に
PS C:\WINDOWS\system32>


じゃあコレをps1ファイルに記述して食わせた場合どうなるか

PS C:\WINDOWS\system32> C:\Users\xxx\Desktop\仕事\script\ps1\hello.ps1
PS C:\WINDOWS\system32> hello
hello : 用語 'hello' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されませ
ん。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してくだ
さい。
発生場所 行:1 文字:1
+ hello
+ ~~~~~
+ CategoryInfo : ObjectNotFound: (hello:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

PS C:\WINDOWS\system32>


認識しない。
どうやら関数の前にglobal:がついてないと呼び出しても使えないらしい。
コードを以下に書き換えて実施した。

function global:hello { write-host "hello powershell world!!" }
function global:enl { write-host "青は灰に" }
function global:res { write-host "緑は塵に" }

結果は・・・

PS C:\WINDOWS\system32> C:\Users\xxx\Desktop\仕事\script\ps1\hello.ps1
PS C:\WINDOWS\system32> hello
hello powershell world!!
PS C:\WINDOWS\system32> enl
髱偵・轣ー縺ォ
PS C:\WINDOWS\system32> res
邱代・蝪オ縺ォ
PS C:\WINDOWS\system32>



関数で呼び出した文字が何故か化ける。
これは$OutputEncodingがUS-ASCIIになっている事が問題かと思ったのだが
ps1のファイル保存時文字コードが「UTF-8(BOM付き)」じゃないとなるらしい。

PS C:\WINDOWS\system32> C:\Users\xxx\Desktop\仕事\script\ps1\hello.ps1
PS C:\WINDOWS\system32> enl
青は灰に
PS C:\WINDOWS\system32> res
緑は塵に
PS C:\WINDOWS\system32> $OutputEncoding = New-Object System.Text.ASCIIEncoding
PS C:\WINDOWS\system32> $OutputEncoding


IsSingleByte : True
BodyName : us-ascii
EncodingName : US-ASCII
HeaderName : us-ascii
WebName : us-ascii
WindowsCodePage : 1252
IsBrowserDisplay : False
IsBrowserSave : False
IsMailNewsDisplay : True
IsMailNewsSave : True
EncoderFallback : System.Text.EncoderReplacementFallback
DecoderFallback : System.Text.DecoderReplacementFallback
IsReadOnly : True
CodePage : 20127



PS C:\WINDOWS\system32> enl
青は灰に
PS C:\WINDOWS\system32> res
緑は塵に
PS C:\WINDOWS\system32>


というわけでシェル化した文字の呼び出しだけでもコレだけトラブルがある。
企業でこれをやると「問い合わせして答えもらって解決して」「影響も聞いて」「ネットにある答えは最終手段」となるので非常に鈍足となるのである。

次記事もヨロシク

WindowsPowerShellを使ってみる2
http://doplxyz.livedoor.biz/archives/52166986.html