如何从命令提示符将命名数组参数传递给其中包含空格的powershell脚本?

时间:2014-03-14 16:27:26

标签: powershell

我试图将几个参数传递给$ attachments参数中的以下脚本,这似乎适用于单个附件,或者当路径中没有空格时,但是当传递多个时当一个或多个脚本在路径中出现空格而脚本失败并指示它无法找到指定的文件时,该值为数组。

为了增加难度,这是从c#启动的。我已尝试过以下命令的几种排列。整个命令行看起来像这样:

powershell.exe -executionpolicy unrestricted -file "c:\program files (x86)\App\Samples\SendEmail.ps1" -attachments "c:\Program Files (x86)\App\Logs\1234.log,c:\Program Files (x86)\App\Logs\12345.log"

剧本:

param(
    [array]$attachments,
    [string]$from = 'test@test.com',
    [array]$to = 'test@test.com',
    [string]$subject = 'Threshold Exceeded',
    [string]$body = 'Testing. Please ignore.',
    [string]$smtpServer = 'testsmptserver.com'
)

$mailParams = @{
    From = $from
    To = $to
    Subject = $subject
    Body = $body
    SMTPServer = $smtpServer
}

if ($attachments)
{
    Get-ChildItem $attachments | Send-MailMessage @mailParams
}
else
{
    Send-MailMessage @mailParams
}   

有没有人遇到过这样的事情?你是怎么解决的?

2 个答案:

答案 0 :(得分:1)

您需要拆分$ attachments变量,因为它被视为单个文件。

而不是

Get-ChildItem $attachments

尝试

Get-ChildItem ($attachments -split ',')

答案 1 :(得分:0)

您只将一个(引用的)字符串传递给“附件”数组,因此您只填充附件[0]。 尝试传递多个字符串:

    PS C:\Windows\system32> [array]$wrong="there,you,go"

    PS C:\Windows\system32> $wrong
    there,you,go

    PS C:\Windows\system32> $wrong[0]
    there,you,go

    PS C:\Windows\system32> $wrong[1]

    PS C:\Windows\system32> $wrong[2]

    PS C:\Windows\system32> [array]$right="there","you","go";

    PS C:\Windows\system32> $right
    there
    you
    go

    PS C:\Windows\system32> $right[0]
    there

    PS C:\Windows\system32> $right[1]
    you

    PS C:\Windows\system32> $right[2]
    go

    PS C:\Windows\system32> 

从那里开始,你应该很清楚你可以包括这样的前导或尾随空格:

    -attachments "value 1 has a trailing space "," value 2 has a leading space"

得到:

    attachments[0]="value 1 has a trailing space ";
    attachments[1]=" value 2 has a leading space";

你提到你是在C#中运行它,所以我会提醒读者也要在包含这个命令的C#字符串中转义每个引号(“ - > \”)。