我正在使用一个脚本在我的机器上发送电子邮件,该脚本是一个sh脚本,我需要通过另一个批处理脚本自动执行该脚本,问题是当我直接复制Powershell命令上的代码时,代码运行良好,将发送电子邮件,但当我尝试使用脚本运行它时,它总是失败:这是我的电子邮件代码:
$EmailFrom = “whatever@gmail.com”
'$EmailTo = “whatever@gmail.com”
'$Subject = “helooo2o”
$Body = “test test test”
$SMTPServer = “smtp.gmail.com”
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential(“whatever@gmail.com”, “pwd”);
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
当我把它直接放在CMD上,然后Powershell上时,它工作得很好,但当我使用这个脚本时它不起作用:
C:WindowsSystem32WindowsPowerShellv1.0powershell.exe -windowstyle hidden -command 'C:Usersuser1Desktoptest.sh'
此外,当我将PowerShell与命令Bash test.sh一起使用时,它会显示以下内容:
bash /test.sh: cannot execute binary file
你们能帮我吗?我需要用批处理脚本自动运行这个脚本,提前谢谢。
-
将PowerShell代码保存在扩展名为
.ps1
的文件中,而不是.sh
。这样可以确保PowerShell知道该文件是PowerShell脚本(请参阅下文(。 -
保存文件时,使用字符编码UTF-8和BOM,以确保Windows PowerShellCLI
powershell.exe
相对于文件中的非ASCII范围字符正确解释脚本文件,尤其是代码中使用的引号“
(左双引号,U+201C
(- 使用这样的排版引号-与通常的ASCII范围引号(
"
(引用标记,U+0022
(和'
(APOSTROPHE,U+0027
(,用作单引号(在PowerShell中工作良好,但前提是PowerShell引擎识别出脚本文件的实际字符编码;有关详细信息,请参阅此答案
- 使用这样的排版引号-与通常的ASCII范围引号(
背景信息:
-
您在Windows上运行,在那里,它纯粹是一个脚本文件的文件名扩展名,例如
.sh
,决定执行它的解释器。-
在Unix世界中,使用扩展名
.sh
是一种(不明智的(约定,表明给定文件是一个shell脚本设计用于由POSIX兼容shell(如/bin/sh
(解释;但是,除非文件通过其文件权限标记为可执行文件,并且通过shebang行指定要使用的实际解释器,否则您不能直接调用此类文件:您需要将它们作为参数传递给目标解释器的可执行文件。 -
例如,在Windows上,是Git Bash将扩展名
.sh
注册为使用bash
执行,这就是为什么您试图调用.sh
文件时会导致bash
错误消息的原因。
-
-
此外,在PowerShell内部,
.ps1
文件在进程内运行,类似于批处理文件(.cmd
、.bat
(在cmd.exe
进程内运行的方式。