确定当前PowerShell脚本位置的最佳方法是什么?

核能气质少年 提交于 2020-02-28 04:52:21

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

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

$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的执行对象。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!