Shell 文件 (*.sh) 到批处理文件 (*.bat) 转换器?

Shell 文件 (*.sh) 到批处理文件 (*.bat) 转换器?

将 shell 脚本转换为批处理文件非常繁琐。有没有办法可以自动轻松地将 .sh 转换为 .bat 或将 .bat 转换为 .sh?

答案1

我对此表示严重怀疑。正是因为它做起来很繁琐,或者更准确地说,因为它繁琐的原因是:系统完全不同,更不用说所涉及的软件了。

这不仅仅是#!在顶部添加或删除一行的问题。以我编写的 shell 脚本中的这一行为例:

STREAM_FROM=$($ZFS list -t snapshot ${BACKUP_TARGET_FS} -H -o name -r | grep '@backup_' | tail -n 1 | cut -d '@' -f 2)

(是的,可能有比使用一些管道更有效的方法,但这不是重点;所讨论的脚本不需要一流的性能。)这是变量赋值、子 shell 表达式扩展、通过环境变量扩展调用命令、环境变量扩展、管道greptail以及cut 全部都集中到一个声明中。为了准确地转换这一个语句,您需要了解所有这些工作原理以及调用的标准实用程序的各种选项的确切语义,以及如何在目标系统上重新创建该行为。

假设您在两个系统上都安装了 ZFS 实用程序(所以我们不必担心这部分)。您打算如何自动地,将其转换为 Windows 批处理文件语句或语句集?我认为,除非你能做类似解决停机问题,编写一个通用转换器(如您正在寻找的转换器)是不可能的。与自然语言翻译不同,计算机程序的行为“接近”原始行为还远远不够好:任何不完美之处都是错误。

或者以我前几天做的一个扫描工作为例(当然这不是一个脚本,但它也可能是一个脚本;我只是把它输入到终端中,因为这是一次性的事情);我最终得到了与下面类似的结果:

for n in $(seq 10 66); do scanimage --button-controlled=yes -x 180 -y 200 --mode Gray --format=tiff > scan${n}.tmp && convert scan${n}.tmp scan${n}.png && \rm scan${n}.tmp; done

这是一个复杂的例子,因为 --button-controlled 选项是由后端,而不是由scanimage(SANE)本身。因此,转换此单行代码的工具需要了解每个 SANE 后端提供的每个选项及其在目标系统上的对应选项;这显然不可行,甚至可能不可行可能的

即使是真正简单的、只对一组文件进行迭代的 shell 脚本也不大可能自动转换。而且这种简单的脚本很少见。

此外,“shell 脚本”并不是同质的东西:转换 bash shell 脚本所需的内容与转换 zsh shell 脚本所需的内容不同,转换用 Perl 编写的 shell 脚本所需的内容也不同。在许多情况下,各种语法甚至可能不存在直接对应的语法,这进一步增加了翻译的复杂性。

相关内容