【发布时间】:2020-01-18 08:47:06
【问题描述】:
我正在创建一些我使用 perl 的培训材料。我想做的一件事是为学生正确设置脚本,无论他们在哪里添加压缩文件。我正在处理一个 Windows 批处理文件,它将 perl 模板复制到工作位置,然后将 perl 模板文件副本中的路径更新到正确的位置。 perl 模板的第一行是:
#!_BASE_software/perl/bin/perl.exe
批处理文件如下所示:
SET TRAINING=%~dp0
copy %TRAINING%\template\*.pl %TRAINING%work
%TRAINING%software\perl\bin\perl -pi.bak -e 's/_BASE_/%TRAINING%/g' %TRAINING%work\*.pl
我有几个问题:
- Perl 似乎不喜欢文件名中的通配符
- 事实证明,%TRAINING% 将扩展为带有反斜杠的字符串,需要将其转换为正斜杠,并且需要在正则表达式中进行转义。
我该如何解决这个问题?
【问题讨论】:
-
您的代码严重缺少双引号。您可以使用
%TRAINING:\=/%自动将反斜杠替换为正斜杠。请记住,%~dp0已经包含一个尾部反斜杠,在你有的地方和其他你没有的地方。 -
s///的第二部分不是正则表达式,而是带引号的字符串。也就是说,如果它扩展到带有正斜杠的东西,它仍然是一个问题(语法错误)。在环境中设置它可能更简单,然后使用 Perl 中的$ENV{TRAINING}。 -
也许 ExtUtils::Command 会有所帮助。流行的 UNIX 实用程序的 Perl'ish 实现
-
看看
help for,尤其是`/f'选项。
标签: regex perl batch-file