- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我在这个目录结构中有 2 个文件,A.ps1
和 B.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/
假设我在这个目录结构中有 2 个文件,A.ps1 和 B.ps1: -- 📁 root | |-- A.ps1 | |-- 📁 subfolder | |-- B.ps1 A.
问题 我正在与 Jenkins 合作远程部署 PowerShell 脚本。因此,我试图弄清楚使用 $PSScriptRoot 是否会出现问题超过 $MyInvocation.MyCommand.Pat
我正在尝试编写一个 powershell 脚本,它将使用 Installcfg.cfg 文件安装 Java。无论脚本在哪里执行,我都希望它能够运行。当任何文件路径中没有空格时它工作正常但是当我从另一个
我正在从 .NET 应用程序运行 PowerShell 脚本,但由于未设置 $PSScriptRoot 而失败。如何设置? 代码: var ps = PowerShell.Create(); ps.R
我是一名优秀的程序员,十分优秀!