我有一个用于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会将字符串的第一部分解析为一个参数,将下一行的字符串解析为另一个参数。错误。那我该怎么办?
答案 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%"