如何在Windows批处理文件中拆分多行中的长字符串,同时仍然允许cmd.exe将其解析为单个参数?

时间:2017-09-22 20:43:12

标签: windows batch-file cmd

我有一个用于cmd.exe的Windows批处理文件。它有一行代码来调用PowerShell Send-MailMessage cmdlet并退回到cmd.exe。目前该行的内容如下:

PowerShell -Command "Send-MailMessage -To one.person@somewhere.com, another.person@sameplace.com -Subject 'A rather lengthy text' -From info@my.com -SmtpServer hostname.subdomain.mycompany.com -UseSsl -Credential (New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'UserName',('SecretePassword1234'|ConvertTo-SecureString -AsPlainText -Force)) -Body 'A static text.'"

效果很好。但我觉得很难在NotePad或任何文本编辑器中编辑它,因为这条线太长了。我想要的是使用CMD.EXE的插入符^字符将双引号内的长字符串分成多行。但是,PowerShell.EXE命令需要:

PowerShell -Command <string>

上述语法要求CMD.EXE解析-Command之后的所有内容,使其成为 SINGLE 字符串,即一个参数。我尝试过以下无法解决的问题:

PowerShell -Command "Semd-MailMessage Blab Blab " ^
"More Blah Blah"

如果我在上面的批处理文件中分解行,CMD.EXE会将字符串的第一部分解析为一个参数,将下一行的字符串解析为另一个参数。错误。那我该怎么办?

4 个答案:

答案 0 :(得分:2)

我会将您的命令放入powershell脚本中,然后使用以下命令(或类似的东西)从cmd调用它:

powershell.exe -noprofile -executionpolicy bypass -file "path to my file.ps1"

然后你的编辑都可以在powershell ide中发生,你可以根据需要拆分你的命令;通过使用变量和/或使用`(后退)字符。您的Powershell脚本可能看起来像以下一样,更容易管理;另外,在编辑脚本时,您将获得intellisense的好处:

Send-MailMessage `
-To one.person@somewhere.com, another.person@sameplace.com `
-Subject 'A rather lengthy text' `
-From info@my.com `
-SmtpServer hostname.subdomain.mycompany.com `
-UseSsl `
-Credential (New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'UserName', ('SecretePassword1234'|ConvertTo-SecureString -AsPlainText -Force)) `
-Body 'A static text.'

答案 1 :(得分:1)

我同意,因为你已经表明这不起作用:

PowerShell -Command "Semd-MailMessage Blab Blab " ^
"More Blah Blah"

......并且也同意这不是:

@Echo Off
PowerShell -Command "Get-WmiObject -Class Win32_Product "^
"| Select-Object -Property Name | Sort-Object Name"
Pause

但是这样做:

@Echo Off
PowerShell -Command "Get-WmiObject -Class Win32_Product "^
 "| Select-Object -Property Name | Sort-Object Name"
Pause

...请注意延续线开头处非常小但看似非常重要的单个空间!

答案 2 :(得分:1)

我认为this is是解决此问题的最简单,最清晰的方法,因为此方法不需要额外的文件或其他选项,只需要简单的PowerShell代码:

PowerShell  ^
   Send-MailMessage  ^
      -To one.person@somewhere.com, another.person@sameplace.com  ^
      -Subject 'A rather lengthy text'  ^
      -From info@my.com  ^
      -SmtpServer hostname.subdomain.mycompany.com  ^
      -UseSsl  ^
      -Credential (New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'UserName',('SecretePassword1234'^|ConvertTo-SecureString -AsPlainText -Force))  ^
      -Body 'A static text.'

请确保正确转义特殊批处理字符,例如^|

答案 3 :(得分:0)

您可以在批处理文件中设置变量,也可以像这样完全执行某些操作。

@echo off

setlocal enabledelayedexpansion
set "pscommand="
FOR %%G IN (
            "Send-MailMessage -To one.person@somewhere.com, "
            "another.person@sameplace.com "
            "-Subject 'A rather lengthy text' "
            "-From info@my.com "
            "-SmtpServer hostname.subdomain.mycompany.com "
            "-UseSsl -Credential "
            "(New-Object -TypeName System.Management.Automation.PSCredential "
            "-ArgumentList 'UserName',('SecretePassword1234'|ConvertTo-SecureString -AsPlainText -Force)) "
            "-Body 'A static text.'"
            ) DO (
                set "pscommand=!pscommand!%%~G"
            )

PowerShell -Command "%pscommand%"