1. ホーム
  2. powershell

[解決済み] 現在のPowerShell実行ファイルを取得するにはどうすればよいですか?

2022-10-02 12:10:32

質問

注:PowerShell 1.0

現在実行中のPowerShellのファイル名を取得したい。つまり、私がこのようにセッションを開始した場合です。

powershell.exe .\myfile.ps1

文字列を取得したい ".\myfile.ps1" (という文字列(またはそのようなもの)を取得したいのですが。 EDIT : "myfile.ps1"。 が望ましいです。

何かアイデアはありますか?

どのように解決するのですか?

PowerShell 5用に更新された、様々な回答をここにまとめてみました。

  • PowerShell 3 以降しか使っていない場合は $PSCommandPath

  • 古いバージョンとの互換性が必要な場合は、シムを挿入してください。

    if ($PSCommandPath -eq $null) { function GetPSCommandPath() { return $MyInvocation.PSCommandPath; } $PSCommandPath = GetPSCommandPath; }

    これは $PSCommandPath を追加します。

    シムコードはどこでも(トップレベルでも関数内でも)実行可能ですが $PSCommandPath 変数は通常のスコープルールに従います(例えば、関数内に shim を置いた場合、その変数はその関数にのみスコープされます)。

詳細

様々な回答で使われる4種類のメソッドがあるので、それぞれを実演するためにこのスクリプトを書きました(さらに $PSCommandPath ):

function PSCommandPath() { return $PSCommandPath; }
function ScriptName() { return $MyInvocation.ScriptName; }
function MyCommandName() { return $MyInvocation.MyCommand.Name; }
function MyCommandDefinition() {
    # Begin of MyCommandDefinition()
    # Note: ouput of this script shows the contents of this function, not the execution result
    return $MyInvocation.MyCommand.Definition;
    # End of MyCommandDefinition()
}
function MyInvocationPSCommandPath() { return $MyInvocation.PSCommandPath; }

Write-Host "";
Write-Host "PSVersion: $($PSVersionTable.PSVersion)";
Write-Host "";
Write-Host "`$PSCommandPath:";
Write-Host " *   Direct: $PSCommandPath";
Write-Host " * Function: $(PSCommandPath)";
Write-Host "";
Write-Host "`$MyInvocation.ScriptName:";
Write-Host " *   Direct: $($MyInvocation.ScriptName)";
Write-Host " * Function: $(ScriptName)";
Write-Host "";
Write-Host "`$MyInvocation.MyCommand.Name:";
Write-Host " *   Direct: $($MyInvocation.MyCommand.Name)";
Write-Host " * Function: $(MyCommandName)";
Write-Host "";
Write-Host "`$MyInvocation.MyCommand.Definition:";
Write-Host " *   Direct: $($MyInvocation.MyCommand.Definition)";
Write-Host " * Function: $(MyCommandDefinition)";
Write-Host "";
Write-Host "`$MyInvocation.PSCommandPath:";
Write-Host " *   Direct: $($MyInvocation.PSCommandPath)";
Write-Host " * Function: $(MyInvocationPSCommandPath)";
Write-Host "";

出力します。

PS C:\> .\Test\test.ps1

PSVersion: 5.1.19035.1

$PSCommandPath:
 *   Direct: C:\Test\test.ps1
 * Function: C:\Test\test.ps1

$MyInvocation.ScriptName:
 *   Direct:
 * Function: C:\Test\test.ps1

$MyInvocation.MyCommand.Name:
 *   Direct: test.ps1
 * Function: MyCommandName

$MyInvocation.MyCommand.Definition:
 *   Direct: C:\Test\test.ps1
 * Function:
    # Begin of MyCommandDefinition()
    # Note this is the contents of the MyCommandDefinition() function, not the execution results
    return $MyInvocation.MyCommand.Definition;
    # End of MyCommandDefinition()


$MyInvocation.PSCommandPath:
 *   Direct:
 * Function: C:\Test\test.ps1

注意事項

  • から実行されます。 C:\ であるが、実際のスクリプトは C:\Test\test.ps1 .
  • を伝えるメソッドはありません。 が渡される の起動パス ( .\Test\test.ps1 )
  • $PSCommandPath は唯一の信頼できる方法ですが、PowerShell 3 で導入されました。
  • 3 より前のバージョンでは、単一のメソッドが関数の内側と外側の両方で機能することはありません。