gpt4 book ai didi

powershell - 点源文件中的 PSScriptRoot 如何工作?

转载 作者:行者123 更新时间:2023-12-05 01:22:32 27 4
gpt4 key购买 nike

假设我在这个目录结构中有 2 个文件,A.ps1B.ps1:

-- 📁 root
|
|-- A.ps1
|
|-- 📁 subfolder
|
|-- B.ps1

A.ps1:

Write-Host $PSScriptRoot

B.ps1:

. "\root\A.ps1"

现在,取 this fact考虑到:

Dot sourcing takes the script you've specified and immediately executes it as though it had been at that spot in your original script

问题:如果我要运行 B.ps1,我会期望结果是 \root\subfolder ,但是是\root,为什么??

如果 A.ps1 点源到 B.ps1,脚本 A.ps1 的内容不应该运行 好像它们是直接在B.ps1 中编写的?意思是,难道 $PSScriptRoot 不应该像从 B.ps1 调用一样运行,从而评估为 \root\subfolder 吗?我什至通过将 A.ps1 包装在一个函数中并在 B.ps1 点源之后调用该函数来测试它。仍然产生相同的结果..

点源到底是如何运作的?

最佳答案

正如评论者所指出的,$PSScriptRoot 独立于作用域。来自docs (强调我的):

$PSScriptRoot
Contains the full path of the executing script's parent directory.

Dot-Sourcing 并没有在字面上“包含”脚本(例如,与 C++ 的 #include 指令相反),PowerShell 仍然知道它正在运行一个不同的脚本。与调用脚本(显式使用调用运算符& 或通过输入路径运行脚本)相比,唯一不同的是scoping。 .

虽然有一种方法可以获取调用脚本的 $PSScriptRoot。将脚本点源化为 advanced function cmdlet通过使用 CmdletBinding() 和/或 Parameter() 属性。这使得自动变量 $PSCmdlet可用,它为您提供(除其他外)调用脚本的 $PSScriptRoot

A.ps1

# CmdletBinding is an attribute of param(), so that is required as well
[CmdletBinding()] param()

$PSScriptRoot # Outputs directory that contains A.ps1
$PSCmdlet.MyInvocation.PSScriptRoot # Outputs directory of the invoking script

关于powershell - 点源文件中的 PSScriptRoot 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73834735/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com