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

Ran*_*der 4 powershell

我刚刚学习Powershell.我试图调用另一个B.ps1带有参数的PS脚本.

Invoke-Expression "C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1 -ServerName medsys-dev"
Run Code Online (Sandbox Code Playgroud)

B.ps1:

Param([string]$ServerName)
...
...
Run Code Online (Sandbox Code Playgroud)

当我尝试执行时B.ps1,我收到以下错误:

术语"C:\ AzureFileShare\MEDsys\Powershell"不会被识别为cmdlet,函数,脚本文件或可操作程序的名称.

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

Jam*_* C. 23

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

另一种方法是使用在其自己的范围内运行脚本的&调用运算符

& "C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1" -ServerName medsys-dev
Run Code Online (Sandbox Code Playgroud)

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

Invoke-Expression "&'C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1' -ServerName medsys-dev"
Run Code Online (Sandbox Code Playgroud)

点采购要好得多,因为您只需将脚本路径用双引号括起来并保持原样:

."C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1" -ServerName medsys-dev
Run Code Online (Sandbox Code Playgroud)

  • 致读者:这不应该是公认的答案,因为点 (`.`) 运算符会影响范围。您应该改用 `&` 运算符(请参阅我的回答)。 (2认同)

Bil*_*art 7

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

& "C:\AzureFileShare\MEDsys\Powershell Scripts\B.ps1" -param1 arg1...
Run Code Online (Sandbox Code Playgroud)

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

C:\AzureFileShare\MEDsys\PowershellScripts\B.ps1 -param1 arg1...
Run Code Online (Sandbox Code Playgroud)

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