10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PowerShellでps1ファイルに使う文字コードと改行コードについて

Last updated at Posted at 2021-10-29

PowerShellといえば下記の2種類が存在しています。

  • Windows+.NET Frameworkを背景としたWindows PowerShell
  • cross platform+.NETを背景としたPowerShell

このようにWindowsPowerShellPowerShellが混在する環境があった場合に利用するPowerShellスクリプトファイルの文字コードと改行コードについて考えてみます。

理想としては、一度書いたスクリプトは手直しせずに他の環境でも実行できると最高ですが。
現状は文字コードと改行コードがネックになり、これはなかなか難しいかと思います。

ドキュメント

適切なエンコードの選択

本記事を書くに当たって、調べていたら、MSDocsのPowerShellドキュメントの上記ページにエンコードについての記載がありました。

なんとなく感覚で理解してた部分についてまとめられていました。
下記引用。

主に Windows アプリケーションと Windows PowerShell を使用している場合は、BOM ありの UTF-8 または UTF-16 のようなエンコードをお勧めします。

複数のプラットフォームにまたがって作業する場合は、BOM ありの UTF-8 をお勧めします。

主に Linux 関連のコンテキストで作業する場合は、BOM なしの UTF-8 をお勧めします。

Windows-1252 とラテン-1 は基本的にレガシ エンコードであり、できれば避けてください。 ただし、一部の古い Windows アプリケーションではそれらに依存している可能性があります。

スクリプトの署名はエンコードに依存している点にも注意してください。つまり、署名されたスクリプトのエンコードを変更するには再署名が必要です。

改行コードについての記載はありませんが概ね下記のような理解で問題ないかと思います。

  • OSはWindowsを利用してWindows PowerShellを利用する場合 UTF8+BOM + CRLF
  • OSはWindowsLinuxのクロスプラットフォームでWindowsPowerShellPowerShellが混在する場合 UTF8+BOM + CRLF
  • OSはLinuxだけでPowerShellのみ利用 UTF-8+BOMless + LF

各種文字コードのスクリプトがそれぞれのプラットフォームでどのように動作するか確認してみる

  • Windows 10 + WindowsPowerShell 5.1 で WindowsPowerShellプロンプトから実行
  • Windows 10 + PowrShell 7.1.5 でPowerShellプロンプトから実行
  • WSL(Ubuntu 20.04) + PowerShell 7.1.5 でBash(shebang)から実行
  • WSL(Ubuntu 20.04) + PowerShell 7.1.5 でPowerShellプロンプトから実行

の組み合わせでそれぞれどうなるか確認してみます。

用意するスクリプトの組み合わせは下記

  • UTF8+BOM + CRLF
  • UTF8+BOM + LF
  • UTF8+BOMLess + CRLF
  • UTF8+BOMLess + LF
UTF8-BOM-CRLF.ps1
#!/usr/bin/env pwsh

PROCESS {

    Set-StrictMode -Version Latest
    $ErrorActionPreference = "stop"

    Write-host "HelloWorld こんにちは世界
    on UFT8+BOM CRLF"

}
UTF8-BOM-LF.ps1
#!/usr/bin/env pwsh

PROCESS {

    Set-StrictMode -Version Latest
    $ErrorActionPreference = "stop"

    Write-host "HelloWorld こんにちは世界
    on UFT8+BOM LF"

}
UTF8-BOMLess-CRLF.ps1
#!/usr/bin/env pwsh

PROCESS {

    Set-StrictMode -Version Latest
    $ErrorActionPreference = "stop"

    Write-host "HelloWorld こんにちは世界
    on UFT8+BOMLess CRLF"

}
UTF8-BOMLess-LF.ps1
#!/usr/bin/env pwsh

PROCESS {

    Set-StrictMode -Version Latest
    $ErrorActionPreference = "stop"

    Write-host "HelloWorld こんにちは世界
    on UFT8+BOMLess LF"

}

Windows 10 + WindowsPowerShell 5.1 で WindowsPowerShellプロンプトから実行

image.png

UTF8-BOM付きのファイルは問題ありませんが、BOMLessの方は日本語が文字化けしているがわかります。

Windows 10 + PowrShell 7.1.5 でPowerShellプロンプトから実行

image.png

Windows+PowerShellのケースだと今回用意したパターンでも問題なさそうです。

WSL(Ubuntu 20.04) + PowerShell 7.1.5 でBash(shebang)から実行

image.png

Bashからshabengを利用してPowerShellスクリプトを実行しようとすると、UTF8-BOMLess-LFのみ実行できました。

BOM付きのスクリプトについては、shabengの前にBOMが入っていることによっておかしくなり、CRLFの改行コードでもおかしい事になりと影響大です。

WSL(Ubuntu 20.04) + PowerShell 7.1.5 でPowerShellから実行

image.png

PowerShellから実行するとすべていい感じに実行してくれています。

まとめ

Linux環境でshabengを利用してPowerShellスクリプトを実行しなくてはならない場合は、UTF8+BOMLess LFしか選択肢が無い事がわかりました。

それ以外のケースでは、だいたいUTF8+BOM CRLF or UTF8+BOM LFの利用が無難な感じがします。

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?