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

一个Powershell脚本使用参数调用另一个,powershell,Powershell,我正在尝试调用另一个PS脚本B.ps1,该脚本包含一个参数: Invoke-Expression "C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1 -ServerName medsys-dev" 然后在B.ps1中: Param([string]$ServerName) ... ... 当我试图执行调用表达式时,出现以下错误: 术语“C:\AzureFileShare\MEDsys\Powershell”无法识别为cmdlet、函数、脚本文

我正在尝试调用另一个PS脚本
B.ps1
,该脚本包含一个参数:

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

Param([string]$ServerName)
...
...
当我试图执行
调用表达式
时,出现以下错误:

术语“C:\AzureFileShare\MEDsys\Powershell”无法识别为cmdlet、函数、脚本文件或可操作程序的名称

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

使用点源

就像这样:

."PathtoScript\script.ps1" "ParamValue"

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

另一种方法是使用在其自身范围内运行脚本的:

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

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

Invoke-Expression "&'C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1' -ServerName medsys-dev"
更好的方法是将脚本路径用双引号括起来,并保持参数不变:

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

您不需要调用表达式或点源。只需运行脚本:

& "C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1" -param1 arg1...
如果脚本的路径和/或文件名包含空格,请将脚本括在引号中,并使用
&
(call)运算符运行脚本。如果脚本的路径和/或文件名不包含引号,则可以在不使用引号或
&
运算符的情况下运行脚本:

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

我不建议使用点源脚本的原因是,脚本中的变量、函数等将出现在当前会话中。如果您只想运行脚本,而不想用脚本中的内容污染当前会话的命名空间,那么这可能不是您的目的。

点源脚本。@guiwhatssthat-What?看看我发布的答案
\B.ps1-参数“Value”
您必须将目录更改为B.ps1的位置。否,你不必改变位置。只需指定要运行的脚本的路径和文件名。谢谢。这很接近。但现在我得到了以下错误:找不到接受参数“C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1”的位置参数。请参见编辑,我从测试中复制了错误的行。读者:这不应该是可接受的答案,因为点(
)运算符会影响作用域。您应该改用
&
运算符(请参见我的答案)。如果有其他更简单的方法不会导致不必要的命令注入,则不建议使用
iex
调用表达式
)。查看我的答案-您只需要
&
接线员。我们可以在这个呼叫中使用-Credential参数吗?