通过别名将脚本加载到 PowerShell 控制台

Load script into a PowerShell console via an alias

要将脚本文件加载到打开的 PS 控制台(例如导入函数),需要点源或导入模块小程序。

在函数内部使用它(创建别名)不起作用,例如:

Function psinit1 { . C:\Scripts\scriptFunktions.ps1 }
Function psinit2 { Import-module C:\Scripts\scriptFunktions.ps1 -force}

当我调用 psinit1psinit2 时,我没有收到错误消息,但我的功能不可用。为什么这不起作用,我是否正确地假设该函数打开一个加载脚本的新范围(并在函数完成后关闭)?

我怎样才能让它工作?

除非您通过 . 调用函数,dot-sourcing 运算符,其主体在 子作用域中执行 ,以便您在其中执行的任何操作 - 除非您明确针对不同的范围 - 仅限于 该子范围及其后代范围 .

因此,为了使您的函数按预期工作,即使定义对 调用者的 作用域可见,dot-source 它们的调用 也是:

. psinit1

一般来说,注意 while Import-Module also accepts .ps1 scripts, its primary purpose is to act on modules。对于 .ps1 脚本,它的行为实际上类似于 dot-sourcing,除了 重复 一个 Import-Module 调用与子范围内的 .ps1 脚本失败,除非还指定了 -Force(以强制重新加载)。

结果:不要将 Import-Module.ps1 脚本一起使用:

  • 避免的主要原因是它做出了无法兑现的承诺:因为简单的 dot-sourcing 发生了,没有实际的 模块 已导入 - 尽管 名义上 出现在 Get-Module 的输出中,以脚本文件的基本文件名命名(例如,foo 用于脚本 foo.ps1).

  • 因为发生了简单的dot-sourcing,你可以使用Remove-Module卸载 稍后脚本的定义;虽然您可以在导入的 pseudo-module 上 调用 Remove-Module,但它 没有效果 : dot-sourced定义仍然有效。