首页 > 解决方案 > 无法使用 Invoke-Command 将参数哈希表传递给另一个脚本

问题描述

我已经构建了一个脚本,用于动态更改 HTML 模板并将其作为电子邮件发送,它使用哈希表来更改项目,因为它可能需要更改的项目数量波动(似乎比数组更好)

变量等的电子邮件发送和替换都正常工作,我遇到的问题是当我尝试从另一个脚本调用它并传入带有替换和 to/fromsubject 的哈希表时,我正在使用 Splatting,因为它似乎最好的选择,我尝试按原样传入哈希表,并尝试了 start-job 和 Invoke-Expression

PowerShell版本:5.1

这是我用来调用电子邮件脚本的代码

$TemplateReplacements = @{}
$TemplateReplacements.Add("EmailTo","firstname.lastname@company.com.au")
$TemplateReplacements.Add("EmailFrom","ISnotifications@company.com.au")
$TemplateReplacements.Add("EmailSubject","Test Test Test")
$TemplateReplacements.Add("EmailTemplate","\ZeroLicenses.html")
$TemplateReplacements.Add("Heading","Heading replaced from main script")
$TemplateReplacements.Add("1","Variable1 repalced from main script")
$TemplateReplacements.Add("2","Variable2 replaced from main script")
$TemplateReplacements.Add("3","Variable3 replaced from main script")
$TemplateReplacements.Add("4","Variable4 replaced from main script")

$ScriptToRun = "C:\Users\User1\Desktop\Projects\Powershell\EmailVarReplace-Test\Test3.ps1"

$params = @{
                Replacements = $TemplateReplacements
            }

Invoke-Command $ScriptToRun @Params


#start-job $ScriptToRun @params

在被调用的电子邮件脚本中,我在顶部有这个我相信我需要它来接受参数?

[CmdletBinding()]
param ($Replacements)

我已经为此困扰了很久,只是不断收到错误

Invoke-Command : A parameter cannot be found that matches parameter name 'Replacements'.
At C:\Users\User1\Desktop\Projects\Powershell\EmailTest.ps1:19 char:29
+ Invoke-Command $ScriptToRun @Params
+                             ~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.InvokeCommandCommand

我期望发生的事情是将哈希表传递到脚本中,这样它就可以获取将电子邮件发送到何处、来自哪个地址、主题以及电子邮件中变量替换的变量

我将电子邮件脚本构建为独立模块,稍后只需要创建模板和脚本调用它并进行替换

任何帮助将不胜感激

也忽略硬编码路径等,因为它仍然是一个测试脚本:p

标签: powershell

解决方案


不要Invoke-Command用来调用您的脚本-Invoke-Command实际上只在远程处理的上下文中有用,即如果您使用-ComputerName参数在一台或多台远程计算机上运行脚本块的脚本。

相反,使用调用运算符&来调用您的脚本,然后喷溅应该按预期工作:

& $ScriptToRun @Params

至于你尝试了什么:

如果您尝试通过 喷溅Invoke-Command,则喷溅将应用于参数,而不是您正在调用的脚本的参数。

因此,在's 的-Replacements参数而不是你的脚本的参数中寻找一个参数- 并且没有这样的参数,这解释了你得到的错误。Invoke-Command


推荐阅读