我想使用这样的伪语法来引入脚本文件:
Include '.\scripA.ps1'
但我找到的唯一一件事是像这样的东西:
$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. ($thisScript + '.\scriptA.ps1')
那很难看。
有没有一些好看的方法来使用相对路径包含脚本?
我想使用这样的伪语法来引入脚本文件:
Include '.\scripA.ps1'
但我找到的唯一一件事是像这样的东西:
$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. ($thisScript + '.\scriptA.ps1')
那很难看。
有没有一些好看的方法来使用相对路径包含脚本?
你可以像这样利用$PSScriptRoot参数:
. "$PSScriptRoot\script.ps1"
您可以点命令,即将该文件包含进来:
. .\scriptA.ps1
要获取脚本的完整路径:
Resolve-Path .\scriptA.ps1
虽然如前所述,点号调用是最简单的选项但不太美观。然而,使用这种格式稍微更加整洁一些:
$ScriptDirectory = Split-Path $MyInvocation.MyCommand.Path
. (Join-Path $ScriptDirectory ScriptA.ps1)
另外,关于相对路径的一点需要明确的说明:原帖子可能似乎想要一个相对于当前工作目录的路径;但实际上意图是相对于当前脚本源目录(正如alex2k8自己的代码示例所表明的那样)。因此,这使得当前脚本能够访问同一代码库中的其他脚本。
(Join-Path $PSScriptRoot settings.ps1)
”(以点号开头的命令)。 - Walter A从V2版本开始(本地版本在Win7/2008R2上启动;请参见$psversiontable.psversion
),您可以轻松地包含一个文件,如下所示:
. "RelativeOrAbsolutePathToFile\include.ps1"
$result = FunctionInIncludeFile()
cd
到包含脚本的目录,它就可以正常运行,但如果您从另一个目录调用它,则无法正常运行。 - user87453. (($PSScriptRoot | Split-Path | Split-Path)+'somedir\ps\script.ps1')
这个方法可能适用于任何目录,但如果您的起始目录不是要包含的文件的直接前置目录,则查找速度会非常慢。也就是说,如果您搜索的起点是c:\或其他驱动器的根目录,那么这可能会非常慢。
. $(Resolve-Path -literal $(gci -Recurse include.ps1))
如果您在PC上开发脚本,但需要将它们部署到作为计划任务运行脚本的服务器上,则此方法特别有效。
. .\path\to\script.ps1
,当您从Windows资源管理器或PS终端在同一文件夹中运行脚本时它可以工作,但在部署到Azure时它一直失败。这个答案完全解决了这个问题。 - theyetiman