【问题标题】:Running sh script with a bat script使用 bat 脚本运行 sh 脚本
【发布时间】:2021-06-13 13:46:37
【问题描述】:

我正在使用脚本在我的机器上发送电子邮件,该脚本是一个 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:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe  -windowstyle hidden -command 'C:\Users\user1\Desktop\test.sh'

当我将 PowerShell 与以下命令一起使用时:Bash test.sh 它显示了这个:

bash /test.sh: cannot execute binary file

你们能帮我吗?我需要用批处理脚本自动运行这个脚本,谢谢。

【问题讨论】:

  • 您上面的内容与 BASH 或 SH 无关。您包含这两个标签还有其他原因吗? powershell 和 Linux bash/sh 的语法完全不同。 Bash 和 sh 最多以 UTF-8 编码处理 ASCII 文本。我怀疑你的文件是 UTF-16 格式的。
  • 你好,谢谢你的回复,但我刚刚用我的记事本++检查了一下,上面写着UTF-8
  • 文件的扩展名应该是.ps1。这与 bash 无关。
  • @aze 您上面给出的代码不是shell脚本代码,无论文件格式如何。请尝试研究基础知识。
  • 您在问题中显示的代码是 PowerShell 代码而不是 bash。 PowerShell 脚本的扩展名是 .ps1。此外,您还有 2 个变量定义错误 '$EmailTo'$Subject。删除这些变量开头的'

标签: powershell


【解决方案1】:
  • 将您的 PowerShell 代码保存在文件中扩展名为 .ps1,而不是 .sh。这可确保 PowerShell 知道该文件是 PowerShell 脚本(见下文)。

  • 保存文件时,使用字符编码 UTF-8和 BOM 以确保 Windows PowerShell CLIpowershell.exe 正确解释您的脚本文件关于文件中的非 ASCII 范围字符,尤其是代码中使用的引号,(左双引号,U+201C

    • 使用这种 印刷引号 - 与通常的 ASCII 范围引号 (" (QUOTATION MARK, U+0022) 和 ' (APOSTROPHE, U+0027) 不同, 用作 单引号) 在 PowerShell 中工作正常,但前提是 PowerShell 引擎识别脚本文件的实际字符编码;请参阅this answer 了解更多信息。

背景信息

  • 您在Windows 上运行,它纯粹是一个脚本文件的文件名扩展名 - 例如.sh - 决定了哪个解释器将执行它。

    • 使用扩展名.shUnix 世界中的一个(不明智的)约定,表明给定文件是一个shell 脚本 设计为由 POSIX 兼容的 shell 解释,例如/bin/sh;但是,除非通过文件权限将文件标记为可执行并且通过shebang line指定要使用的实际解释器,否则您不能直接调用此类文件:您需要将它们作为参数传递给目标解释器的可执行文件。

    • 例如,在 Windows 上,Git Bash 将扩展名.sh 注册为使用bash 执行,这就是为什么您尝试调用.sh 文件会导致bash 错误消息的原因。

  • 此外,在 PowerShell 内部,.ps1 文件在进程内运行,类似于批处理文件(.cmd.bat)如何从cmd.exe 在进程内运行。

【讨论】:

    最近更新 更多