如何保护批处理文件中的报价?

时间:2020-03-06 14:41:48  来源:igfitidea点击:

我想将Perl单线包装在批处理文件中。对于一个(简单的)示例,在Unix shell中,我可以引用如下命令:

perl -e 'print localtime() . "\n"'

但是,DOS会通过以下有用的错误消息对此加以扼制:

Can't find string terminator "'" anywhere before EOF at -e line 1.

在.bat文件中执行此操作的最佳方法是什么?

解决方案

对于Windows上的Perl,我尝试使用尽可能多的通用引号,以免出现牙签综合症。我将引号保存为DOS所需的内容:

perl -e "print scalar localtime() . qq(\n)"

如果我们只需要换行,则可以让-l开关为我们完成:

perl -le "print scalar localtime()"

有关我们可以使用开关进行的其他出色操作,请参见perlrun文档。

在Windows的" DOS提示符"(cmd.exe)中,我们需要使用双引号而不是单引号。对于引用的Perl代码,Perl提供了很多选择。三个是:

perl -e "print localtime() . qq(\n)"
perl -e "print localtime() . $/"
perl -le "print ''.localtime()"

如果我们拥有Perl 5.10或者更高版本:

perl -E "say scalar localtime()"

感谢J.F. Sebastian的评论。

在DOS中,我们可以在Perl命令周围使用""。 DOS外壳不像普通的Unix外壳那样做单引号:

perl -e "print localtime();"

首先,我们得到的所有答案都是特定于命令的,因为DOS shell不会像uniq那样解析命令行。它将整个未解析的字符串传递给命令,该命令进行任何拆分。也就是说,如果使用/ subsystem:console,则C运行时会在调用main()之前提供拆分,并且大多数命令都使用此方法。

如果应用程序正在使用此拆分,则键入文字双引号的方式是将其加倍。所以你会做

perl -e "print localtime() . ""\n"""

对于Windows NT +下的常规批处理文件,^字符转义了许多内容(<> |&),但对于引号,将它们加倍可以产生奇迹:

C:\>perl -e "print localtime() . ""\n"""
Thu Oct  2 09:17:32 2008