変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

powershell

[Windows11]PowerShellのアップグレードとその後

フォルダとかでターミナルを開くと

アップデートしよう!と毎回出てくる。

ちなみに今現在は・・・

> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.22621.4111
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.22621.4111
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

先のリンク先へジャンプすると・・・

Windows PowerShell 5.1 から PowerShell 7 への移行

のページが開くが、インストール方法s(msiファイルとかzipファイルとか…)の解説ページだった。

その中で一番簡単そうなのはMicrosoft Storeからのダウンロードだ。

Microsoft StoreでPowerShellを検索すると

表記されたバージョンが古いとおもったけど「4.2★」が、「人気度4.2」の意味だった。

アプリ名の下の数値は普通「人気度」なんだけど、

ツール系のアプリの場合はその前にバージョンを表記するのが普通だから・・・紛らわしい。

PowerShellのプレートにマウスをフォーカスすると、取得済み(アンスコした後なせいかな?)からインストールに変わるのでボタンを押す。

PowerShell 7.4.5
PS C:\Windows\System32> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.4.5
PSEdition                      Core
GitCommitId                    7.4.5
OS                             Microsoft Windows 10.0.22631
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

無事今の最新版になったのでこれでOK。

と思ったが、フォルダからターミナルで開くをすると古いまま。

スタート全てのアプリからPowerShellをスタートにピン止めしクリックすれば新しいバージョンが起動できるけど、他は古いまま。

サイドバイサイド(同じOSで新旧のバージョンがどっちも使える)だけどさぁ?

新旧どうやって使い分ければいいのかな?

ちなみに

環境変数PATHを確認してみるとC:\Program Files\PowerShell\7がありここにインストしたかのように見えるが、削除して再インスコしても出てこないので、これは過去のインスーラのせいな気がする。

実際には他のアプリ同様にC:\Users\[ユーザ名]\AppData\Local\Microsoft\WindowsAppsにpwsh.exeとしてインストされている。

Microsoft Windows [Version 10.0.22631.4112]
(c) Microsoft Corporation. All rights reserved.

C:\Users\[ユーザ名]>where pwsh.exe
C:\Users\[ユーザ名]\AppData\Local\Microsoft\WindowsApps\pwsh.exe

先のページではバージョン別の居場所は

Windows PowerShell 5.1$env:WINDIR\System32\WindowsPowerShell\v1.0
PowerShell 6.x$env:ProgramFiles\PowerShell\6
PowerShell 7$env:ProgramFiles\PowerShell\7
バージョン別の居場所

となっているが、C:\ProgramFiles\PowerShellなんてフォルダすらできてない。

C:\Windows\System32\WindowsPowerShell\v1.0にはpowershell.exeがあるのでこれが旧バージョンらしい。

Microsoft Windows [Version 10.0.22631.4112]
(c) Microsoft Corporation. All rights reserved.

C:\Users\[ユーザ名]>where powershell.exe
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

つまり、現在はEXEのファイル名で新旧バージョンを切り替えて使うのが良いのかもしれない。

と云う訳で、新版はターミナルでpwshで起動するのが一番簡単かな?

ターミナルのタイトルの「v」の設定の「新しいプロファイルを追加します」から

新バージョン用のプロファイルを作ってみた。

注意点としてはコマンドラインを指定する際に参照ボタンからpwsh.exe ファイルを探し出して開くボタンを押してしまうと

となってしまうので、見つけたpwsh.exeでパスのコピーでクリップボードに入れ、エントリーボックスに貼り付ける様にすることかな?

ついでに旧版のプロファイルの名前にバージョンを加えてみた。

最後に設定のスタートアップで新バージョンを指定した。

これで、フォルダのターミナルを開くで、すぐPowerShell新バージョンで使える。

とりあえずコレで良い???かな???????



[Wnidows]PowerShell

色々できる(ハズ

EXEからアイコンを取り出す方法をさがしていたら、PowerShellでもできるらしい。

※Ver6からはSystem.Drawing.Iconが無い様だ。Windows10はVer5だから動くけど。

しかし、文法が ソースっぽさとコマンドラインが混ざってる(メンドクサイ

例えば、PowerShellの窓を開き

元ネタ:https://suzuzusu.hatenablog.com/entry/2016/10/14/043726
###########################################################
# アイコンを抽出して保存
###########################################################
function ExtractionIcon( 
            $Path,      # 抽出する .exe のフルパス
            $OutFile    # 出力する .ico のフルパス
        ){

    # アセンブリロード
    Add-Type -AssemblyName System.Drawing
    Add-Type -AssemblyName System.IO

    $str1 = "ExtractionIcon :Path=`"$Path`", :OutFile=`"$OutFile`""
    $str1
    # アイコンデータ抽出
    $IconData = [System.Drawing.Icon]::ExtractAssociatedIcon( $Path )

    # 出力用ファイルストリーム
    $FS = New-Object System.IO.FileStream( $OutFile, [System.IO.FileMode]::Create )

    # 保存
    $IconData.Save( $fs )
    $fs.Close()

    # オブジェクトの始末
    $fs.Dispose()
    $IconData.Dispose()
}

と貼り付けると、

窓が開いている間だけ使える。(便利

しかし、この関数を呼び出す時はコマンドプロンプトっぽく

> ExtractionIcon "C:\Program Files (x86)\Sarad\DiCE\dice.exe" "a:\aaa\aaa.ico"

と打つ。

関数の中では、関数っぽく呼び出すのだから・・・

コマンドプロンプトから1コマンドづつ打って動作を確かめた後、

関数化する際には

「コマンドっぽい記述は関数っぽく書き直さないといけない。」

のが面倒だな。

後、Windowsでパパっと使う都合上、デスクトップに貼る場合、

Join-Path $env:UserProfile\Desktop "sample.ico"

で済ましたいがOneDriveをインストしてしまうと、アンスコしてもパスが変わってしまうから

Join-Path [System.Environment]::GetFolderPath("Desktop") "sample.ico"

と書かないと動かないPCも出てくる。

更に、コマンドラインのパラメータの区切りは空白文字なのは常識なので

コマンドのパラメータにコマンドを使うと、 どっちのパラメータなのか判らなくなる。

〇 コマンド  (コマンド パラメータ1 パラメータ2)  パラメータ3

× コマンド  コマンド パラメータ1 パラメータ2  パラメータ3

だから、パラメータにコマンドの戻り値を使うなら、PowerShellでは()で括る仕様になっている。

先のEXEからアイコンを取り出すコマンドをコマンドラインから呼び出すには

ExtractionIcon "C:\Program.....\xxx.exe" (Join-Path [System.Environment]::GetFolderPath("Desktop") "sample.ico")

となってしまう。

最後に、今のPowerShellはRestrictedで、スクリプトファイルは実行不可で、

一時的に許可するなら

> pwsh.exe -ExecutionPolicy RemoteSigned xxxx.ps1 

ps1のショートカットの場合も

powershell -ExecutionPolicy RemoteSigned -File ${元の内容}

となる。

ま、当然何でもできるから危なっかしい。

いくらPS1を実行不可にしても気の利いたショートカットを作られたら・・・

結局、MSが作ると、

大抵は使い物にならない

しかし、使い物になる様にバージョンアップすると

危なっかしい。

これは定説だな。




top