每当需要引用公共模块或脚本时,我喜欢使用相对于当前脚本文件的路径。这样,我的脚本总能在库中找到其他脚本。

那么,确定当前脚本目录的最佳标准方法是什么?目前,我正在做:

$MyDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)

我知道在模块(.psm1)中,您可以使用$PSScriptRoot来获取此信息,但在常规脚本(即.ps1文件)中不会设置此信息。

获取当前PowerShell脚本文件位置的规范方法是什么?


当前回答

PowerShell 3 +

# This is an automatic variable set to the current file's/module's directory
$PSScriptRoot

PowerShell 2

在PowerShell 3之前,没有比查询 一般脚本的定义属性。我在基本上每个PowerShell脚本的顶部都有以下一行:

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition

其他回答

你也可以考虑split-path -parent $ pisse . currentfile。如果任何其他方法失败,则返回Fullpath。特别是,如果你运行一个文件来加载一堆函数,然后在ISE shell中执行这些函数(或者如果你run-selected),上面的Get-Script-Directory函数似乎不起作用。

我需要知道脚本名称以及它在哪里执行。

给MyInvocation结构加上前缀“$global:”,当从主脚本和导入的. psm1库文件的主线调用时,将返回完整的路径和脚本名称。它也可以在导入库中的函数中工作。

在反复折腾之后,我决定使用$global: myinvoke . invocationname。 它可靠地工作与CMD启动,运行与Powershell,和ISE。 本地和UNC发射都返回正确的路径。

function func1() 
{
   $inv = (Get-Variable MyInvocation -Scope 1).Value
   #$inv.MyCommand | Format-List *   
   $Path1 = Split-Path $inv.scriptname
   Write-Host $Path1
}

function Main()
{
    func1
}

Main

PowerShell 3 +

# This is an automatic variable set to the current file's/module's directory
$PSScriptRoot

PowerShell 2

在PowerShell 3之前,没有比查询 一般脚本的定义属性。我在基本上每个PowerShell脚本的顶部都有以下一行:

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition

适用于 PowerShell 3.0

$PSCommandPath
    Contains the full path and file name of the script that is being run. 
    This variable is valid in all scripts.

函数为:

function Get-ScriptDirectory {
    Split-Path -Parent $PSCommandPath
}