«

""


[PowerShell] PowerShell7のインストールとコマンドラインからの切り替え

Windows11では、デフォルトのPowerShellは version 5 系です

version 7 系を入れるときのインストール方法と、コマンドラインでの切り替え方法とを記載しておきます

前提環境:
- Windows11

PowerShell 7 のインストール

上記に丁寧に記載されてるので私のブログに書かなくても良いのですけど
ログ付きにしておくので、誰かの参考になればと思います
わたしは WinGet で入れました

前提:デフォルトのPowerShellのバージョンを調べておく

5系でした

PS C:\WINDOWS\System32> $PSVersionTable

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

1. WinGet でインストールする

PS C:\WINDOWS\System32> winget search Microsoft.PowerShell
The `msstore` source requires that you view the following agreements before using.
Terms of Transaction: https://aka.ms/microsoft-store-terms-of-transaction
The source requires the current machine's 2-letter geographic region to be sent to the backend service to function properly (ex. "US").

Do you agree to all the source agreements terms?
[Y] Yes  [N] No: yes
Name               Id                           Version Source
---------------------------------------------------------------
PowerShell         Microsoft.PowerShell         7.5.4.0 winget
PowerShell Preview Microsoft.PowerShell.Preview 7.6.0.5 winget
PS C:\WINDOWS\System32> winget install --id Microsoft.PowerShell --source winget
Found PowerShell [Microsoft.PowerShell] Version 7.5.4.0
This application is licensed to you by its owner.
Microsoft is not responsible for, nor does it grant any licenses to, third-party packages.
Downloading https://github.com/PowerShell/PowerShell/releases/download/v7.5.4/PowerShell-7.5.4-win-x64.msi
  ██████████████████████████████   107 MB /  107 MB
Successfully verified installer hash
Starting package install...
Successfully installed
PS C:\WINDOWS\System32>

上記の続きで、同じプロンプトに $PSVersionTable tと書いても、まだ v5 のままです
v7 のプロンプトに切り替えなければいけません
つまり PowerShellは v5v7 が共存できます

2. PowerShell 7を起動

スタートメニューから powershell と入れると上部にはWindows11デフォルトのものが表示されます
よく見ると PowerShell 7 も選択できるようになっているので、そちらを選択します

PowerShell 7.5.4
PS C:\Users\sao> $PSVersionTable

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

PS C:\Users\sao>

無事に PowerShell 7 が利用できるようになりました!

PowerShell 5/ 7/ cmd のコマンドラインでの切り替え

ずばり、コマンドはこれです: cmd/powershell/pwsh

cmd: Command Prompt

PS C:\Users\sao> cmd
Microsoft Windows [Version 10.0.26200.6899]
(c) Microsoft Corporation. All rights reserved.

C:\Users\sao>

powershell: PowerShell 5

念のため、$PSVersionTable でバージョン確認

PS C:\Users\sao> powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows

PS C:\Users\sao> $PSVersionTable

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

powershell: PowerShell 7

C:\Users\sao>pwsh
PowerShell 7.5.4
PS C:\Users\sao> $PSVersionTable

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

PS C:\Users\sao>

この pwsh ってコマンドをよく忘れてしまい、何度も調べてるので、自分のブログに書きました


[PowerShell] ZoneIDとPowerShellの実行ポリシー

PowerShellでちょっとしたツールを動かそうと思って、初歩的なところであれ?となったので、書いておきます

PowerShellの実行ポリシー(Execution Policy)は、

1
> Get-ExecutionPolicy

このコマンドで確認できます

Windows10のデフォルトでは Restricted になっていて、ps1 ファイルをコマンドライン上から実行することが出来ません
なので

1
> Set-ExecutionPolicy RemoteSigned

を実行して、 RemoteSigned にセキュリティポリシーを変更します

しかし、RemoteSigned になってることを確認したのに、
しかしなぜか、ps1 ファイルの実行時にセキュリティエラーとなってしまいました

なんだこれ(↓)は…?

1
セキュリティ エラー: PSSecurityException

なんでだろーと思ってたのですが、何てことはない
実行しようとしてた ps1 ファイルは、インターネット越しに入手したものでした
(自分のサイトから落としてきたんだけどね)

こんな感じ↓↓↓

どうやら、インターネット越しに入手したファイルには ZoneID というのが付与されるらしく
Windowsはローカルファイルと区別出来るようにしてくれてるんですね~

ローカルファイルとして扱いたい時には、ポチっと「ブロックの解除」を押せばOKです

ちゃんと、ps1 ファイルが動作するようになりました(^^♪

ZoneID…知らなかった…><。

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


[PowerShell] ファイル分割スクリプト

大きなファイルを分割する必要があって
めっちゃ困りましたけど、また PowerShell で解決しました
なかばやけくそ

<sep.ps1>

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$my_path_name = "c:/tmp/"
$my_file_name = "abc"
$my_file_kind = ".log"
$cut_num      = 2000    # 切り取る行数

$my_file = $my_path_name + $my_file_name + $my_file_kind

$count = 0;
Get-Content $my_file -ReadCount $cut_num -Encoding UTF8 | 
    ForEach-Object { 
        $count ++
        $cfs = "{0:D3}" -f $count;
        $_ > ($my_path_name+$my_file_name+'_'+$cfs+$my_file_kind)
    }

結果

あまり何も考えず、元ネタはこの方のブログですー


[PowerShell] 連想配列をソートしてforeachで一個づつ取り出す

PowerShell で連想配列を用いた時のソート&foreach のサンプルがなかなか探せなかったのでメモします

とある連想配列

PS C:\> $tbl = @{
>>       k00 = "orange";
>>       k01 = "peach";
>>       k02 = "apple"
>>  }

出力は簡単

PS C:\> $tbl

Name                           Value
----                           -----
k01                            peach
k02                            apple
k00                            orange

ソートの出力も簡単

PS C:\> $tbl.GetEnumerator() | Sort-Object Value

Name                           Value
----                           -----
k02                            apple
k00                            orange
k01                            peach

# もしくは

PS C:\> $tbl.GetEnumerator() | sort Value

Name                           Value
----                           -----
k02                            apple
k00                            orange
k01                            peach

これを一つづつ取り出して処理したい

単に foreach で取り出すとき

PS C:\> foreach( $k in $tbl.Keys ){
>>   Write-Output $k
>>   Write-Output $tbl[ $k ]
>>   Write-Output '-----'
>> }

k01
peach
-----
k02
apple
-----
k00
orange
-----

さらにソートして foreach で取り出すとき

PS C:\> $tbl.GetEnumerator() | sort Value |
>>   ForEach-Object{
>>       Write-Output $_.Name
>>       Write-Output $_.Value
>>       Write-Output '-----'
>>   }

k02
apple
-----
k00
orange
-----
k01
peach
-----

ForEach-Object を使いました ただの foreach() でも出来ると思うんですけど、私的用途が満たせたので、これ以上は調べてないです

検索で、「powershell foreach ソート -perl」 などで検索しても、日本語の情報があまり出てこなかったので、参考になれば幸いです(^^)


[PowerShell] 32bitと64bitの使い分け

PowerShellにはちゃんと 32bit版と 64bit版が備わっています

Windows2008 R2
Windows2012 R2
共に同じ場所にあります(~o~)

64bit版
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

32bit版
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe

デフォルトの64bitマシンであれば、コンソールで

> powershell

とすると、64bitモードが立ち上がります

これはどういうことかというと、64bitのアプリから使うライブラリなどは、64bitでないとダメってことです

何にはまったかというと、PowerShell から System.Data.OracleClient に接続するとき

たとえDBサーバが 64bit Oracle だったとしても
Oracle Client はデフォルトでは 32bit になっているようです

powershell から oracle に接続しようとしたときこんな感じになります

# アセンブリのロード
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Data.OracleClient")

# 接続
$conn_str = "Data Source=saoDB;User ID=sao;Password=password;Integrated Security=false;"
$ora_conn = New-Object System.Data.OracleClient.OracleConnection($conn_str)

# インスタンス
$ora_cmd = New-Object System.Data.OracleClient.OracleCommand
$ora_cmd.Connection = $ora_conn

# データベースに接続
$ora_conn.Open()

(参考)powerShellからOracleを使う(接続・切断)
http://harikofu.blog.fc2.com/blog-entry-114.html

このDB接続直後に、64bit のPowerShell だと
こんなエラーが出ます

"0" 個の引数を指定して "Open" を呼び出し中に例外が発生しました: "Oracle クライアント ライブラリを読み込もうとしましたが、BadImageFormatException が発行されました。この問題は、32 ビットの Oracle クライアント コンポーネントが
インストールされている環境で 64 ビット モードを実行すると発生します。"
発生場所 行:1 文字:22
+ $ora_conn.Open <<<< ()
    + CategoryInfo          : NotSpecified: (:) []、MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

問題解決方法は2つ

既存の稼働環境に影響を与えない様にするという意味では
不毛ですが後者を選択すると波風立てずにコトを済ませられます