powershell - 在参数中使用点源函数

标签 powershell

首先我要说的是,我在 PowerShell 方面还是个新手,希望有办法做到这一点。

我们有一个 utils.ps1 脚本,它只包含我们在其他脚本中点源的函数。如果未传入值,其中一个函数会返回默认值。我知道我可以检查 $args 等,但我想要的是使用该函数作为参数中的默认值。

param(
    [string]$dbServer=$(Get-DefaultParam "dbServer"), 
    [string]$appServer=$(Get-DefaultParam "appServer")
)

这不起作用,因为 Util 脚本尚未获取。我不能把点源放在第一位,因为这样参数就不起作用,因为它不是顶行。 utils 不是模块,我不能使用#require。

我得到的是这个

param(
    [ValidateScript({ return $false; })]
    [bool]$loadScript=$(. ./Utils.ps1; $true),
    [string]$dbServer=$(Get-DefaultParam "dbServer"), 
    [string]$appServer=$(Get-DefaultParam "appServer")
)

创建一个加载脚本的参数并防止将值传递到该参数。这将在正确的范围内加载脚本,如果我在 ValidateScript 中加载它,它不在正确的范围内。那么剩下的参数就可以访问Utils.ps1中的函数了。这可能不是受支持的副作用,又名 hack,就好像我将 loadScript 移动到其他参数下方一样失败,因为脚本尚未加载。

  1. PowerShell 保证参数始终按顺序加载?
  2. 我们是否应该将 Utils.ps1 中的所有函数放在全局范围内?这需要在其他脚本之前运行 Utils.ps1 - 这在脚本编写中似乎没问题,但在手动运行脚本时不太理想
  3. 除了模块和#require 之外,是否还有更受支持的方式来执行此操作?
  4. 如果我们需要运行该函数,最好不要使用参数的默认值,而是在采购后对所有检查进行编码并检查 $args?

最佳答案

最好将该脚本转换为 PowerShell Module ,尽管你声明你希望避免一个。这样,只要安装了模块,您的功能就始终可用。此外,尽管不想使用它,#Require 指令 是您对脚本设置执行约束的方式,例如必须为脚本安装的 PowerShell 版本或模块发挥作用。


如果您真的不想将其放入模块中,您可以从执行用户的$profileutils.ps1。只要您不使用 -NoProfile 参数运行 powershell.exe,每个 session 都会加载配置文件,并且您的函数将可供使用。

关于powershell - 在参数中使用点源函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59648260/

相关文章:

powershell - 如何设置默认位置以在 profile.ps1 中启动?

powershell - Azure 自动化中的自定义 PowerShell DSC 复合资源

powershell - Get-CimInstance win32_networkadapterconfiguration返回Powershell中的MAC和IP地址

powershell - $($variableName) 在 PowerShell 中的可扩展字符串中是什么意思?

visual-studio - 使用 PowerShell 打开文件

powershell - 我可以使用 Invoke-WebRequest 将二进制数据写入文件并仍然获取状态代码吗?

powershell - Azure 门户中缺少事件订阅

visual-studio - 在不覆盖现有事件的情况下添加构建后事件

Powershell:逐行读取文本文件并在 "|"上拆分

sql-server - SQL ExecuteReader 抛出 "Incorrect syntax near GO"