PowerShell | Python で自作コマンドを定義する

Powershell で作業をしていると、複雑な操作をプログラミングすることで効率化を図ることができる場面があります。
Python のスクリプトで定義した処理を、Powershell の関数として定義する手法を紹介します。

目次

Powershell プロファイルの配置場所

まずは Powershell のプロファイルスクリプトを作成します。
これは、Powershell 起動時に自動的に読み込まれるスクリプトです。

Powershell 上で $PROFILE と実行すると、そのファイルパスが出力されます。

PowerShell
> $PROFILE
C:\Users\xxxxxxxx\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

ファイルまたはディレクトリが存在しない場合は、新規作成します。
既に存在する場合は、以降のコードをこれに追記します。

Python 自作コマンドの定義

Python 自作コマンドの定義方法を、2通り紹介します。

手法1:Powershell スクリプト内に Python コードを定義

まずは、より安易な方法です。
例として、引数を2つ取得し、その和を出力する myadd コマンドを自作します。

プロファイルスクリプト内に、以下のコードを追記します。

Microsoft.PowerShell_profile.ps1
$pycode = @'
import sys
a = int(sys.argv[1])
b = int(sys.argv[2])
print(a + b)
'@

function myadd { python -c $pycode @args }

pycode 変数に、python の実行コードを文字列として格納しています。
引数チェックなどの本質的でない処理は省略しています。

この文字列を python 実行する形で myadd 関数を定義しています。
python スクリプトを文字列で渡しているため -c オプションを付与しています。

ps1 ファイルを保存した後に PowerShell を開きなおすと、myadd コマンドが利用可能になっています。

PowerShell
> myadd 1 2
3

注意点として、PowerShell のターミナルを再起動しないと、プロファイルが再読み込みされず myadd は実行できません。

スクリプト内定義の問題点

ただし、この方法には問題点があります。

$pycode 変数の展開タイミングは、function 定義時ではなく、function 実行時となっています。
つまり、myadd を実行する前に $pycode 変数を改変してしまうと、myadd が正しく実行されません。

以下、誤操作により期待する結果が得られない例です。

PowerShell
> $pycode = "print('Hello')"
> myadd 1 2
Hello

手法2:PowerShell から Python モジュールを呼び出し(こっちが推奨)

より安全に運用するためには、Python モジュールを Powershell スクリプトとは別に定義しておくのがお勧めです。

ここでは、例として、プロファイルスクリプトと同じ場所に myadd.py を配置します。

myadd.py
import sys

a = int(sys.argv[1])
b = int(sys.argv[2])
print(a + b)

上記のファイルを プロファイルスクリプトから読み込んで function を定義します。

Microsoft.PowerShell_profile.ps1
function myadd {
    $script_path = Join-Path -Path $PSScriptRoot -ChildPath "myadd.py"
    python $script_path @args
}

ここで、$PSScriptRoot 変数は、PowerShell スクリプトが配置されているディレクトリが格納される自動変数です。
スクリプトが起動されるタイミングで自動で定義されます。

PowerShell ターミナルを再起動すると、myadd が実行できるようになります。

PowerShell
> myadd 1 2
3
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次