将函数参数从一个脚本传递到另一个脚本(PowerShell)

jdg4fx2g  于 2023-03-30  发布在  Shell
关注(0)|答案(1)|浏览(172)

我有一个powershell脚本(script1),它将调用远程计算机上的第二个脚本(script2)。我在script2中有一个发送吐司通知的函数。我的目标是在远程计算机上发送通知,所以我有script1,它将调用远程计算机上的script2。
我试图找到一种方法来定义我的函数参数参数与script1,因为script2将运行在远程计算机上,我希望它只运行通知与script1给出的参数。
以下是我目前掌握的情况:
脚本1

Function Show-Notifications {
    [cmdletbinding()]
    Param (
        [string[]]
        $toastApp,
        [string[]]
        $toastTitle,
        [string[]]
        $toastText,
        [string[]]
        $toastImage
    )
    
    $ToastImageAndText02 = [Windows.UI.Notifications.ToastTemplateType, Windows.UI.Notifications, ContentType = WindowsRuntime]::ToastImageAndText02
    $TemplateContent = [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime]::GetTemplateContent($ToastImageAndText02)
    $TemplateContent.SelectSingleNode('//image[@id="1"]').SetAttribute('src', $toastImage)
    $TemplateContent.SelectSingleNode('//text[@id="1"]').InnerText = $toastTitle
    $TemplateContent.SelectSingleNode('//text[@id="2"]').InnerText = $toastText
    [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($toastApp).Show($TemplateContent)
}

Show-Notifications -toastApp $args[0] -toastTitle $args[1] -toastText $args[2] -toastImage $args[3]

脚本2

$hn = Read-Host -Prompt "Computer Hostname"

Invoke-Command -ComputerName $hn -FilePath C:\MyPath\script1.ps1 "Application" "Title" "Text"
Pause

当我运行script1时,我收到以下错误:

Invoke-Command : A positional parameter cannot be found that accepts argument
'Application'.
At C:\MyPath\script1.ps1:8 char:1
+ Invoke-Command -ComputerName $hn -FilePath C:\MyPath\script2.ps1 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], Parameter
   BindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell
   .Commands.InvokeCommandCommand

最后,我希望在变量中定义每个参数,这样我就可以为通知的每个部分定义所需的内容,但现在我希望通过在脚本中定义参数来使其工作。
我已经看过并尝试了不同的方法在网上找到,但也没有工作.
我尝试使用$args = @()$args += ("-toastApp", $arg1),但我收到了一个错误,其中$arg1的内容没有显示,所以我回溯,看到它越来越糟糕,我这样做。
我还尝试为我的参数定义更多的细节,比如位置参数或ValueFromPipeline,但我也没有实现我的目标。

z9smfwbn

z9smfwbn1#

问题在于您如何使用Invoke-Command。它不知道如何处理您要提供给指定脚本的参数列表。请使用-ArgumentList参数指定这些参数作为脚本的参数。

Invoke-Command -ComputerName $hn -FilePath C:\MyPath\script1.ps1 -ArgumentList @("Application","Title","Text")

如果脚本只是创建一个函数,然后调用同一个函数,那么你可以跳过创建函数的过程,让脚本本身接受参数并执行操作。只需删除第1行、第20行和第22行,这样脚本看起来就像这样:

[cmdletbinding()]
Param (
    [string[]]
    $toastApp,
    [string[]]
    $toastTitle,
    [string[]]
    $toastText,
    [string[]]
    $toastImage
)

$ToastImageAndText02 = [Windows.UI.Notifications.ToastTemplateType, Windows.UI.Notifications, ContentType = WindowsRuntime]::ToastImageAndText02
$TemplateContent = [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime]::GetTemplateContent($ToastImageAndText02)
$TemplateContent.SelectSingleNode('//image[@id="1"]').SetAttribute('src', $toastImage)
$TemplateContent.SelectSingleNode('//text[@id="1"]').InnerText = $toastTitle
$TemplateContent.SelectSingleNode('//text[@id="2"]').InnerText = $toastText
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($toastApp).Show($TemplateContent)

相关问题