批处理脚本和正则表达式

时间:2018-06-13 15:38:58

标签: batch-file

我需要将.png文件转换成几个pdf,所有.png文件都在同一个文件夹中,同名文件以数字序列结尾(例如Filename000.png到Filename099.png)。

例如,我需要做:

$ convert Filename000.png Filename001.png Filename002.png Mypdf1.pdf
$ convert Filename003.png Mypdf2.pdf
$ convert Filename004.png Filename005.png Mypdf3.pdf

我有一个列表,其中包含我需要联系的文件名的末尾。例如(根据上面的例子):

000..002 
0003
004..005

我想用批处理脚本自动化任务,是否可以调用列表来指示我想要一起使用的文件名的结尾? 也许我首先需要在命令行中插入正则表达式?我知道有了echo,我可以生成我想要的字符列表,比如$ echo {000..002}。但我不知道如何写这条线。

你知道吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

你很幸运,因为我发现任务有趣, 尽管你没有提供任何自己的代码。

如果文件combine.txt包含此内容:

> type Combine.txt
000..002
003
004..005

我使用findstr对批处理中的行进行编号以获取输出pdf名称:

> findstr /N "^" Combine.txt
1:000..002
2:003
3:004..005

这批:

:: Q:\Test\2018\06\13\SO_50841203.cmd
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
Set "List=Combine.txt"
Set "Prefix=Filename"
Set "Ext=.png"

:: number list entries with findstr and process
For /f "tokens=1,2* delims=.:" %%A in (
  'Findstr /n "^" ^<"%List%" '
) Do (
  set "Range="
  Set "PDF=Mypdf%%A.pdf"
  if "%%C" neq "" (
    REM use a for /l to iterate the range (with a 1 in front for leading zeroes
    for /L %%D in (1%%B,1,1%%C) Do (
      Set "Num=%%D"
      Set "Range=!Range! %Prefix%!NUM:~-3!%Ext%"
    )
  ) else (
    Set "NUM=%%B"
    Set "Range= %Prefix%!NUM:~-3!%Ext%"
  )
  Echo convert !Range:~1! !PDF!
)

产生此输出(仅用于测试回显)

> Q:\Test\2018\06\13\SO_50841203.cmd
convert Filename000.png Filename001.png Filename002.png Mypdf1.pdf
convert Filename003.png Mypdf2.pdf
convert Filename004.png Filename005.png Mypdf3.pdf