如何保护批处理文件中的引号?

时间:2008-09-24 23:55:23

标签: perl batch-file quotes

我想在批处理文件中包含Perl one-liner。对于(平凡的)示例,在Unix shell中,我可以引用如下命令:

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

但DOS使用这个有用的错误消息扼杀了它:

  

在-e第1行的EOF之前的任何地方找不到字符串终结符。

.bat file内完成此操作的最佳方式是什么?

5 个答案:

答案 0 :(得分:13)

对于Windows上的Perl内容,我尝试尽可能多地使用广义引用,这样我就不会得到倾斜的牙签综合症。我保存了DOS所需内容的引号:

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

如果您只需要在打印结束时使用换行符,则可以让-l开关为您执行此操作:

perl -le "print scalar localtime()"

对于您可以使用开关执行的其他很酷的操作,请参阅perlrun文档。

答案 1 :(得分:8)

在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的评论。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

在DOS中,您使用Perl命令周围的“”。 DOS shell不像普通的Unix shell那样做单引号:

perl -e "print localtime();"

答案 4 :(得分:1)

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

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

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