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

5

我希望可以将一个Perl单行命令放到批处理文件中。举个(简单的)例子,在Unix shell下,我可以像这样引用命令:

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

但是DOS会因为以下错误信息而无法处理:

在-e行1之前找不到字符串终止符“'”的任何位置。

.bat文件 中,有什么最好的方法来解决这个问题?

5个回答

13

在Windows上处理Perl相关的事情时,我尽量使用通用引号以避免出现倾斜牙签综合症。对于DOS需要的内容,我会保留引号:

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

如果你只需要在打印结束时换行,可以使用 -l 开关来实现:

perl -le "print scalar localtime()"

要了解关于开关的其他有趣用法,请参阅perlrun文档。


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

好的回答,只是比我接受的那个略微差一点。谢谢! - Jeff Youngstrom
perl -le "print localtime()" -- 输出的是 '2625625810842681' 而不是 'Thu Sep 25 06:25:26 2008',perl -E"say scalar localtime - jfs
这也可以工作[可能会打印“Tue Aug 4 02:54:07 2009”]:perl -le“print scalar localtime()” - Peter Mortensen

2

对于Windows NT+下的一般批处理文件,^字符可以转义很多字符(<>|&),但是对于引号,将其加倍可以奏效:

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

1
在DOS中,您需要使用""来包含您的Perl命令。DOS shell不支持像普通Unix shell那样使用单引号:
perl -e "print localtime();"

1

首先,对于这个问题的任何答案都是特定于命令的,因为DOS shell不像uniq一样解析命令行;它将整个未解析的字符串传递给命令,命令进行任何分割。话虽如此,如果使用/subsystem:console,则C运行时会在调用main()之前提供拆分,并且大多数命令都使用此选项。

如果应用程序正在使用此拆分,则输入一个双引号的方法是将其加倍。所以你会这样做

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接