在 Windows 命令行 上,为什么这个Perl命令失败了?

分享于 

6分钟阅读

电脑

  繁體 雙語

问题:

我正在尝试从复制Perl命令这个答案在 Windows 命令行 环境中的ask。 我相信我已经下载了 Windows 并安装了它,因此这个错误似乎是语法的一个。

Linux shell 中的原始命令是:


ls | perl -pe 's/(.)(.*)_(d{4})(d{2})(d{2})_(d+).jpg/u$1$2,$3-$4-$5,$6,$&/'. filename.csv



我认为 Windows 版本应该是:


dir> perl -pe 's/(.)(.*)_(d{4})(d{2})(d{2})_(d+).jpg/u$1$2,$3-$4-$5,$6,$&/'>> filename.csv



但是,这是我所得到的错误:


Invalid switch -"(.)(.*)_(d{4})(d{2})(d{2})_(d+).jpg".


'/'' is not recognized as an internal or external command,


operable program or batch file.



中运行这个Perl命令的正确语法是什么


回答 1:

Windows 使用 | 作为管道字符。 直接复制命令,但用 dirfilenamels 替换为 expenses.csv

因为我没有评论的名声,所以我作为答案加入了。


回答 2:

另一个答案是不正确的。 如果你这样做,你仍然会在运行时得到错误


C:Users>dir | perl -pe 's/(.)(.*)_(d{4})(d{2})(d{2})_(d+).jpg/u$1$2,$3-$4-$5,$6,$&/'


Can't find string terminator"'" anywhere before EOF at -e line 1.


'/'' is not recognized as an internal or external command,


operable program or batch file.



原因是由于命令中存在多个问题

即使 / 有时分离 dir/b/c/d 或者 yourcommand/param 之类的命令参数,但幸运的是它并不适用于这种情况。 所以 's/(.)(.*)_(d{4})(d{2})(d{2})_(d+).jpg/u$1$2,$3-$4-$5,$6,$&/' 如果其中有任何单词分隔符,则将作为多个参数传递,在本例中为 ,。 所以这个命令相当于英镑perl -pe 's/(.)(.*)_(d{4})(d{2})(d{2})_(d+).jpg/u$1$2 $3-$4-$5 $6 $ &/'

这就是perl出现错误的原因 Can't find string terminator"'" anywhere before EOF at -e line 1 除了从cmd中的行开始,因为在第一个参数以 ' 开头,但是没有关闭 '。 很容易检查它是如何分割成参数的:


E:>type testparam.bat


@echo off


:loop


if"%1"=="" goto :exit


echo"%1"


shift


goto :loop


:exit



E:>testparam -pe 's/(.)(.*)_(d{4})(d{2})(d{2})_(d+).jpg/u$1$2,$3-$4-$5,$6,$&/'


"-pe"


"'s/(.)(.*)_(d{4})(d{2})(d{2})_(d+).jpg/u$1$2"


"$3-$4-$5"


"$6"


"$"


'/'' is not recognized as an internal or external command,


operable program or batch file.



现在看看输出,并注意到有趣的事情发生: 由于这个符号,&/' 将结束前面的命令并执行名为 /'的命令,并输出错误,如上所示

最佳解决方案是使用 ,你可以在其中运行命令,因为在PowerShell中也使用了单引号 quoting


ls |% { $_.Name } | perl -pe 's/(.)(.*)_(d{4})(d{2})(d{2})_(d+).jpg/u$1$2,$3-$4-$5,$6,$&/'> filename.csv



ls 别名中的dirgci 添加到 Get-ChildItem。 你需要 |% ( ,它是 ForEach-Object的别名。) 来打印对象名。 PowerShell中的另一个选项是


cmd/c dir | perl -pe 's/(.)(.*)_(d{4})(d{2})(d{2})_(d+).jpg/u$1$2,$3-$4-$5,$6,$&/'> filename.csv



在cmd中运行命令会更加麻烦( 并且新代码应该使用 PowerShell,因为它有很长时间的默认选项)


dir | perl -pe 's/(.)(.*)_(d{4})(d{2})(d{2})_(d+).jpg/u$1$2^,$3-$4-$5^,$6^,$^&^/'> filename.csv



在这种情况下,将 ' 转换为 " 也有效,但在许多其他情况下


dir | perl -pe"s/(.)(.*)_(d{4})(d{2})(d{2})_(d+).jpg/u$1$2,$3-$4-$5,$6,$&/">> filename.csv



注意,即使在Linux中,你的命令也是错误


ls | perl -pe 's/(.)(.*)_(d{4})(d{2})(d{2})_(d+).jpg/u$1$2,$3-$4-$5,$6,$&/'. filename.csv



你需要 >filename.csv 而不是 . filename.csv



COM  Window  Windows  COMM  Comma  命令行