タグ: Powershell

  • MicrosoftよりPowershell 2.0の具体的な廃止のスケジュールが発表された

    Microsoftより、Powershell 2.0の具体的な廃止のスケジュールが発表された。これによると、2025年8月(今月)~9月(来月)には、Windows11 24H2から削除されるという。

    「PowerShell 2.0」は間もなく削除、今月~来月の更新で ~Windows 11 バージョン 24H2/Server 2025で
    https://forest.watch.impress.co.jp/docs/news/2039392.html

    基本的に、Powershell 5.1がWindows11 24H2にあるので、Powershellがなくなるということはない。けれど、Powershell2.0で明示的に動かしている場合や廃止されているコマンドレットを使っていると動かなくなる。

    Powershellを別のバージョンに移行するとして、候補がPowershell 5.1(Windows Powershell 5.1)か、Powershell 7系だ。2つの違いは、Windows Powershell 5.1が.NET Framework 4.8で動作、Powershell 7系が、.NET(.NET core)で動作、ベースになる環境が異なる。この先を考えるならば、Powershell 7系がいいのだろうけれど、ベースになる.NETはLTSで3年のサポートなので、LTSがリリースされる2年ごとにバージョンを上げていくことになる。互換性はあるから大丈夫なんだろうけれど、ベースの.NETの入れ替えは必要になる。

    Windows PowerShell 5.1 と PowerShell 7.x の相違点
    https://learn.microsoft.com/ja-jp/powershell/scripting/whats-new/differences-from-windows-powershell?view=powershell-7.5

    なんとも悩ましい。割り切って、Powershell 7系に乗り換えて、定期的にアップグレードしていくのがいいのだろうけれど。

  • そろそろPowerShell 2.0が削除されそう

    マイクロソフトが改めて、「Windows PowerShell 2.0」は非推奨であり、将来的に削除すると宣言している。改めて、ということは、本格的に削除する計画の段階にあるとみてよさそうだ。

    「Windows PowerShell 2.0」は非推奨、将来的に削除 ~Microsoftが改めて注意喚起

    https://forest.watch.impress.co.jp/docs/news/2026721.html

    影響は?ということで、ちょっと見てみたが、Windows Server 2019も2022も、PowerShell5系になっている。普通に使う分には、PowerShell5なので問題はなさそうだが、2.0系にしかないコマンドレットを使ってると使えなくなる、ということかな。

    それと、2008R2や2012については、PowerShell2系だが、OSのサポートが切れているので、削除されるとは思えない。そうすると影響は少ないのもかもしれない。

  • TLS1.2で通信できるか確認するPowershell

    Chromeの開発者機能で確認したほうが確実ではあるのだけど、大量にホストがあると、大変なので、Powershellのスクリプトにしてみた。

    以下は、Powershellのスクリプト。

    # TLS 1.2のみを明示的に有効化
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
    # 通信テスト先
    $url = "https://ホスト名"
    
    try {
        $response = Invoke-WebRequest -Uri $url -UseBasicParsing -ErrorAction Stop
        Write-Host "TLS 1.2 で $url に正常に接続できました。"
    } catch {
        Write-Host "TLS 1.2 で $url への接続に失敗しました。"
        Write-Host $_.Exception.Message
    }

    接続失敗すると、接続失敗したメッセージ、とともにエラーメッセージがでる。

    「[Net.SecurityProtocolType]::Tls12」の部分のTls12をTls11やTls13に変えることで、他のバージョンでのテストもできる。

  • PowerShellでCSVファイルをJSON形式に変換する

    Windowsで、Excelの表をJSONに形式にする必要があったので、ExcelからCSVファイルで保存して、Powershellを使って、CSVファイルをJSON形式のファイルに変換した。

    使ったPowershellのスクリプト(コマンドレット)は下記。

    # CSVファイルのパスを指定
    $csvFilePath = "C:\path\to\your\file.csv"
    
    # JSONファイルのパスを指定
    $jsonFilePath = "C:\path\to\your\file.json"
    
    # CSVファイルをインポート
    $csvData = Import-Csv -Path $csvFilePath
    
    # JSONファイルにエクスポート
    $csvData | ConvertTo-Json | Set-Content -Path $jsonFilePath

    最初の2つは、CSVファイルと出力するJSONファイルの指定なので、直接指定すれば2行でOK。

    1行ずつ、Powershellのプロンプトに入力していけば実行できるので楽。文字コードは全部がUTF8で行う想定だったので指定していないが指定することも可能。

  • Powershellでフォルダ内のテキストファイルを1つにまとめる

    DBのテーブルを作成するDDLが個別ファイルで保存していたのだが、1つ1つ開いてコピペして実行していくのは大変。テキストファイルのため、Powershellで1つのファイルにまとめて(マージ)した。そのコマンドのメモ。

    Get-Content *.txt  | Set-Content マージ後のファイル名.txt
  • Powershellでフォルダ内のテキストファイルを1つにまとめる

    DBのテーブルを作成するDDLが個別ファイルで保存していたのだが、1つ1つ開いてコピペして実行していくのは大変。テキストファイルのため、Powershellで1つのファイルにまとめて(マージ)した。そのコマンドのメモ。

    Get-Content *.txt  | Set-Content マージ後のファイル名.txt
  • 古いWindowsのPowershellでメールを送ると文字化けする

    古いWindows(Windows Server 2008 R2) のPowershell(Ver 2.0)で、メールを送付すると、「-Encoding」でUTF8を指定していても文字化けする事象に遭遇した。

    Powershellのスクリプトは、Windows10で、VS Codeを使って書き、文字コードはUTF8にしている。そこで開発したスクリプトファイルを、古いWindowsに持って行って実行する。実行は問題なくできるのだが、そのスクリプトから送られてくるメールが文字化けしてしまう。

    Powershellのスクリプトファイル(.ps1)をみてみると、BOMなしで保存されている。これをBOMありで保存しなおして、古いWindows環境で実行してみると、文字化けが解消した。古いWindows環境のメモ帳では、文字化けせずに開けたが、Powershellの実行環境だと、BOMがないとSJISで開いているようで、ここで文字化けが発生している。

    Powershellのスクリプトを作成するときは、UTFの場合は、BOMありで保存する。

  • Powershellがコード: -1073741502で異常終了する

    Powershellがコード: -1073741502で異常終了することがある。一度、発生すると同じときに実行されているPowershellも立て続けに同じコードで落ちる。

    これを調べてみると、下記の内容が見つかる。

    “0xC0000142” or “-1073741502” Stop error when many PowerShell scripts call the Console.Write method or when you try to start many console applications on a PowerShell console in Windows 7 or in Windows Server 2008 R2
    https://support.microsoft.com/en-us/topic/-0xc0000142-or-1073741502-stop-error-when-many-powershell-scripts-call-the-console-write-method-or-when-you-try-to-start-many-console-applications-on-a-powershell-console-in-windows-7-or-in-windows-server-2008-r2-19f475a2-cbe9-c463-a2b4-b7fe7a1d236d

    Microsoft.powershell.consolehost.dllファイルのエラーが原因で発生しているようで、多くのコンソールがPowershellから開かれることによってリークが発生して、このエラーになる。時間がたつことで、一時的におさまるので、またPowershellの実行ができるようになる。(これも実際の挙動と一致するのでこれだろう)

    修正パッチもあるみたいないので、該当OSならば、パッチを当てるのもよさそうだ。

  • Powershellで他のWindowsに接続するコマンドレット

    前提として、WinRMの設定が行われていて、リモート接続できること。Powershellを開いて、”Enter-PSSession” コマンドレットを実行することで、別のWindowsにPowershellで接続でき、コマンドレットやDOSコマンドを実行することができる。

    Enter-PSSession -ComputerName 接続先のホスト名やIPアドレス -Credential ログイン名

    接続できると、プロンプトのところに、接続先のホスト名が表示されるので、どこにつながっているのかがわる。

    接続を終了するときは、”Exit-PSSession”もしくは”exit” で抜ける。

    実行例。

    PS C:\Users\zen> Enter-PSSession -ComputerName Labo07 -Credential psadmin
    PowerShell credential request
    Enter your credentials.
    Password for user psadmin: *********
    [Labo07]: PS C:\Users\psadmin\Documents>
    [Labo07]: PS C:\Users\psadmin\Documents> Exit-PSSession
    PS C:\Users\zen>
  • Powershellで大容量ファイルの中身をクリア(消す)する方法

    Windowsの端末(Windowsサーバ)で、ログファイルを消さずに、中身だけを消して、クリアにしたかった。Linuxだと、catコマンドを使って、空データで上書きをやっている。Windowsだと、catコマンドがないので、できず。Powershellで、同じようになる方法を調べた。

    Powershellを使って、ファイルの中身だけをクリアする(消す)には、Clear-Contentコマンドレットを使用する。Clear-Itemだとファイル自体を消してしまうが、Clear-Contentは、ファイルを残したまま、中身のみを削除する。

    Clear-Content ファイル名

    実行例)

    PS C:\apache2\logs> dir
        ディレクトリ: C:\apache2\logs
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        2023/06/12     14:17  754742089 access.log
    -a---        2023/06/12     14:12  754741796 access.log.1
    PS C:\apache2\logs> Clear-Content .\access.log
    PS C:\apache2\logs> dir
        ディレクトリ: C:\apache2\logs
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        2023/06/12     14:19          0 access.log
    -a---        2023/06/12     14:12  754741796 access.log.1
    PS C:\apache2\logs> dir
        ディレクトリ: C:\apache2\logs
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        2023/06/12     14:20        240 access.log
    -a---        2023/06/12     14:12  754741796 access.log.1

    なお、Windows Server 2008 R2でもClear-Contentは使えたので、環境を選ばずに使えそうだ。

    参考: https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/clear-content?view=powershell-7.3