如何保护批处理文件中的报价?
时间: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