5

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

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

但是 DOS 用这个有用的错误消息阻止了这一点:

在 -e 第 1 行的 EOF 之前的任何地方都找不到字符串终止符“'”。

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

4

5 回答 5

13

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

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

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

perl -le "print scalar localtime()"

有关您可以使用开关做的其他很酷的事情,请参阅perlrun文档。

于 2008-09-25T00:08:23.833 回答
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()"

感谢JF Sebastian的评论。

于 2008-09-25T00:08:33.630 回答
2

对于 Windows NT+ 下的一般批处理文件,^ 字符会转义很多东西 (<>|&),但对于引号,将它们加倍会产生奇迹:

C:\>perl -e "print localtime() . ""\n"""
Thu Oct  2 09:17:32 2008
于 2008-10-02T14:18:29.163 回答
1

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

perl -e "print localtime();"
于 2008-09-25T00:09:13.830 回答
1

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

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

perl -e "print localtime() . ""\n"""
于 2008-09-25T01:59:32.817 回答