【问题标题】:One Powershell Script calling another with parameters一个 Powershell 脚本调用另一个带参数的脚本
【发布时间】:2017-11-02 12:05:32
【问题描述】:

我正在尝试调用另一个带有参数的 PS 脚本 B.ps1

Invoke-Expression "C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1 -ServerName medsys-dev"

然后在B.ps1:

Param([string]$ServerName)
...
...

当我尝试执行Invoke-Expression 时,出现以下错误:

术语“C:\AzureFileShare\MEDsys\Powershell”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。

我不知道为什么 PowerShell 会抱怨这个,因为 B.ps1 脚本确实存在于引用的文件夹中。除非有其他问题?

【问题讨论】:

  • 点源脚本。
  • @guiwhatsthat - 什么?
  • 看看我贴的答案
  • .\B.ps1 -parameter "Value" 您必须将您的目录更改为 B.ps1 的位置。
  • 不,您不必更改位置。只需指定要运行的脚本的路径和文件名。

标签: powershell


【解决方案1】:

编辑:如我的原始答案中所示,点源脚本会将脚本和变量、对象、函数等加载到当前会话中 - 这在某些情况下可能会产生意想不到的后果。

另一种方法是使用& call operator,它在自己的范围内运行脚本:

& "C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1" -ServerName medsys-dev

问题是您的文件路径中有一个空格,因此您需要将整个路径用单引号括起来,以便正确识别。 (有关单引号和双引号的更多信息,请参阅about_Quoting_Rules)。它最终成为一个凌乱的命令:

Invoke-Expression "&'C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1' -ServerName medsys-dev"

dot-sourcing 更好,因为您只需将脚本路径用双引号括起来并保持原样:

."C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1" -ServerName medsys-dev

【讨论】:

  • 谢谢。这很接近。但现在我收到以下错误:找不到接受参数“C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1”的位置参数。
  • 查看编辑,我从测试中复制了错误的行。
  • 致读者:这不应该是公认的答案,因为点 (.) 运算符会影响范围。您应该改用 & 运算符(请参阅我的答案)。
【解决方案2】:

您不需要Invoke-Expression 或点源。只需运行脚本:

& "C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1" -param1 arg1...

如果脚本的路径和/或文件名包含空格,请将脚本括在引号中并使用&(调用)运算符运行脚本。如果脚本的路径和/或文件名不包含引号,您可以在不带引号或 & 运算符的情况下运行它:

C:\AzureFileShare\MEDsys\PowershellScripts\B.ps1 -param1 arg1...

我不推荐点源脚本的原因是脚本中的变量、函数等会出现在当前会话中。如果您只想运行脚本并且不想用脚本中的内容污染当前会话的命名空间,这可能不是您的意图。

【讨论】:

  • 我们可以在这个调用中使用 -Credential 参数吗?
【解决方案3】:

使用点源

这样:

."PathtoScript\script.ps1" "ParamValue"

【讨论】:

  • 不建议使用iex (Invoke-Expression) 当有其他更简单的方法不会打开不需要的命令注入的可能性时。请参阅我的答案 - 您只需要 & 运算符。
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 2017-07-12
  • 1970-01-01
  • 2022-01-23
  • 2011-10-12
  • 2012-04-13
  • 2011-06-01
相关资源
最近更新 更多