在Windows命令提示符下,我生成一个目录中所有文件的文本文件:
dir c:\logfiles /B > config.txt
输出:
0001_832ec657.log 0002_a7c8eafc.log
我需要将“config.txt”文件提供给另一个可执行文件,但在此之前,我需要修改该文件以添加可执行文件所需的其他信息。 所以我使用下面的命令:
perl -p -i.bak -e 's/log/log,XYZ/g' config.txt
我期待的结果是:
0001_832ec657.log,XYZ 0002_a7c8eafc.log,XYZ
但是,“config.txt”文件未被修改。 使用“-w”选项,我得到警告消息:
在-e行1的无效上下文中无用的常量。
我究竟做错了什么?
Windows cmd.exe
不使用'
作为字符串分隔符”,你正在做的是相当于:
perl -p -i.bak -e "'s/log/log,XYZ/g'" config.txt
所以-w
抱怨“你给了我一个字符串,但它什么也没有”。
解决方法是使用双引号代替:
perl -p -i.bak -e "s/log/log,XYZ/g" config.txt
或者简单地将它们关闭,因为在这个命令中没有可以被cmd.exe
解释的元字符。
cmd.exe
只是一个非常麻烦的野兽,对于任何习惯于sh
式炮弹的人来说。 以下是关于perl
调用的其他一些常见故障和解决方法。
@REM不起作用: perl -e“打印” @REM作品: perl -e“打印” @REM不起作用: perl -e“print \”Hello,world!\ n“” @REM作品: perl -e“print qq(Hello,world!\ n)”
ephemient的答案很好的总结了这个问题,但是你有另外的选择:把你的shell从cmd.exe
改到更好的shell。 如果你是Unix类型的人,那么我会建议看看Cygwin ,它提供了你习惯的环境(例如Bash和GNU工具)。
如果你是一个Windows类型的人,我会建议看看PowerShell (néeMSHnéeMonad)。 事实上,即使你是Unix类型的人,我也会建议寻找PowerShell。 它与.NET集成,并有许多整洁的功能(如通过管道传递的对象而不是简单的文本行)。 如果我被困在一个Microsoft操作系统上,那就是我将要使用的shell。
人们似乎喜欢的Windows的其他shell:
Perl脚本从Linux shell运行。 也许你没有正确地逃避某些事情。