每当需要引用公共模块或脚本时,我都喜欢使用相对于当前脚本文件的路径。 这样,我的脚本始终可以在库中找到其他脚本。
那么,确定当前脚本目录的最佳标准方法是什么? 目前,我正在做:
$MyDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)
我知道在模块(.psm1)中,您可以使用$PSScriptRoot
获取此信息,但是在常规脚本(即.ps1文件)中并没有设置此信息。
获取当前PowerShell脚本文件位置的规范方法是什么?
#1楼
如果其他任何方法失败,您也可以考虑使用split-path -parent $psISE.CurrentFile.Fullpath
。 特别是,如果您运行文件以加载一堆函数,然后在ISE Shell中使用-来执行这些函数(或者如果您运行选择),则上述的Get-Script-Directory
函数似乎不起作用。
#2楼
对于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
}
#3楼
我需要知道脚本名称及其在哪里执行。
在主脚本和导入的.PSM1库文件的主行中调用时,在MyInvocation结构前面加上“ $ global:”前缀将返回完整路径和脚本名称。 它也可以在导入的库中的函数中工作。
经过反复摆弄之后,我决定使用$ global:MyInvocation.InvocationName。 它可与CMD启动,Run With Powershell和ISE可靠地配合使用。 本地和UNC启动都返回正确的路径。
#4楼
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
#5楼
我使用自动变量 $ ExecutionContext。 它可以在PowerShell 2及更高版本中使用。 $ ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath('。\\')
$ ExecutionContext包含一个EngineIntrinsics对象,该对象表示Windows PowerShell主机的执行上下文。 您可以使用此变量来查找可用于cmdlet的执行对象。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3159440