一个Powershell脚本调用另一个参数

时间:2017-11-02 12:05:32

标签: powershell

我试图调用另一个带有参数的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脚本确实存在于引用的文件夹中。除非出现其他问题?

3 个答案:

答案 0 :(得分:6)

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

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

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

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

我不建议对脚本进行点源是因为脚本中的变量,函数等将出现在当前会话中。如果你只想运行脚本而不是用脚本中的东西污染当前会话的命名空间,那么这可能不是意图。

答案 1 :(得分:2)

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

另一种方法是使用在自己的范围内运行脚本的& 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更好,因为您只需将脚本路径用双引号括起来并保持params原样:

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

答案 2 :(得分:-1)

使用点源

就像那样:

."PathtoScript\script.ps1" "ParamValue"