Batch file 批处理文件名的子字符串

Batch file 批处理文件名的子字符串,batch-file,for-loop,substring,filenames,Batch File,For Loop,Substring,Filenames,我需要帮助制作一个批处理代码(如果可能的话)以从文件名中获取子字符串。 我的文件名可以是(文件名长度正在更改): 文件编号-从左到前\uuu id1-带uu分隔符的从1到n的字符串;例如C_C1_C2_C3_C4 id2-始终为9位数字例如011122558 日期-例如2015-07-07 扩展名.jpg 如何为文件夹中的所有文件名循环子字符串(文件号、id1、d2、日期),并将其放入我的代码中 convert - "file number" -annotate "id1" -annotate2

我需要帮助制作一个批处理代码(如果可能的话)以从文件名中获取子字符串。 我的文件名可以是(文件名长度正在更改):

文件编号-从左到前
\uuu

id1-带uu分隔符的从1到n的字符串;例如
C_C1_C2_C3_C4

id2-始终为9位数字<代码>例如011122558

日期-例如
2015-07-07

扩展名
.jpg

如何为文件夹中的所有文件名循环子字符串(文件号、id1、d2、日期),并将其放入我的代码中

convert - "file number" -annotate "id1" -annotate2 "id2" -annotate "date"
例如:

convert - "01" -annotate "C_C1" -annotate2 "012345678" -annotate "2015-07-07"

感谢您的帮助。

纯批处理。简单的字符串操作与标记化相结合。不需要额外的公用设施

g.txt
保存示例文件名;可替换为
'dir/b/a-d'


既然你说的是Windows 7,我就知道你有可用的Powershell。以下是Powershell脚本:

$re = '^(\d+)_((?:(?:[a-zA-Z0-9]+)_?)+)_(\d{9})-(\d{4}-\d\d-\d\d)\.(\w+)$'
dir | ForEach-Object {$_ -replace $re, 'convert "$1" -annotate "$2" -annotate2 "$3" -annotate3 "-$4"'}
考虑到你在问题中给出的文件名

7_D_D1_012345678-2015-07-07.pdf
8_A_087654321-2015-07-07.pdf
10_D_D1_011122558-2015-07-07.pdf
100_C_CCC1_C2_C3_C4_055555555-2015-07-07.pdf
它将生成以下文本输出:

convert "100" -annotate "C_CCC1_C2_C3_C4" -annotate2 "055555555" -annotate4 "2015-07-07"
convert "10" -annotate "D_D1" -annotate2 "011122558" -annotate4 "2015-07-07"
convert "7" -annotate "D_D1" -annotate2 "012345678" -annotate4 "2015-07-07"
convert "8" -annotate "A" -annotate2 "087654321" -annotate4 "2015-07-07"
(文件名排在第一位,因此以100开头的文件名排在第一位,以8开头的文件名排在最后)

通过将此文本输出重定向到.cmd文件,可以根据需要执行convert命令

下面是该正则表达式的分解:

Beginning of line or string
[1]: A numbered capture group. [\d+]
    Any digit, one or more repetitions
_
[2]: A numbered capture group. [(?:(?:[a-zA-Z0-9]+)_?)+]
    Match expression but don't capture it. [(?:[a-zA-Z0-9]+)_?], one or more repetitions
        (?:[a-zA-Z0-9]+)_?
            Match expression but don't capture it. [[a-zA-Z0-9]+]
                Any character in this class: [a-zA-Z0-9], one or more repetitions
            _, zero or one repetitions
_
[3]: A numbered capture group. [\d{9}]
    Any digit, exactly 9 repetitions
-
[4]: A numbered capture group. [\d{4}-\d\d-\d\d]
    \d{4}-\d\d-\d\d
        Any digit, exactly 4 repetitions
@echo关闭
setlocal enableextensions disabledelayedexpansion
每个文件的rem
对于(*.pdf)中的/r“x:\starting\folder”%%z,请执行以下操作(
rem独立编号部件
对于/f“tokens=1,*delims=\\\%%a in(“%%~nz”)do(
设置“_number=%%~a”
设置“_file=%%~fz”
rem单独的日期和ID
对于/f“tokens=1,*delims=-”%%c in(“%%~b”)do(
设置“\u日期=%%~d”
设置“_id=%%~c\”
)
)   
rem将id1和id2分开,将字符串作为路径处理
这样,id2是最后一个元素及其路径
rem是id1
延迟扩展
对于/f“delims=“%%e in(“::!\u id:\!”)do(
端部
设置“_id2=%%~nxe”
设置“_id1=%%~pe”
)
rem更正id1内容(它是一个路径)更改反斜杠
rem到下划线。因为有起始和结束的反斜杠,
rem稍后我们将删除首下划线和结尾下划线
延迟扩展
对于/f“delims=“%%e in”(!\u id1:\=\u1!),请执行以下操作(
端部
设置“_id1=%%~e”
)
rem执行最终命令
延迟扩展
回音(
回显文件[!\u文件!]
回声转换-“!\u编号!”-注释“!\u id1:~1,-1!”-注释2“!\u id2!”-注释“!\u日期!”
端部
)

老实说,我不会在批处理文件中执行此操作。我会执行
dir folder>tmp.cmd
,然后使用具有正则表达式替换功能的文本编辑器(vim、emacs、Notepad Plus)将文件名转换为所需的命令。我需要一个工具来自动生成代码并运行它。也许除了使用文本编辑器之外还有其他方法。我想是
sed
(或者
awk
,或者
perl
)你有什么可用的工具?你可以下载一些工具,还是必须是直接批量的?Powershell呢?我没有,但我可以下载一些东西,你可以给我一些建议。我需要一个在WIN 7下运行的工具,没有管理员权限。谢谢Stephan,现在我使用的是WIN XP,它不起作用(我看不出是什么原因,因为cmd关闭得太快了,我不能暂停)-我将稍后在WIN7上尝试。没有原因,为什么它不应该在XP上运行。从cmd窗口启动它,并/或在第一个
转到:eof
(第三行)之前添加一个
暂停.Dammit.我忘了
代币
代币
选项。非常好。非常感谢!顺便问一下,如果我把文件的完整路径放在g.txt中,比如“C:\Test\7_D_D1012345678-2015-07-07.pdf”,是否可以从g.txt中读取等等。可能会有一些小改动。但是
转换
如何获取路径?或者你会只提供带有路径名的文件,而只处理文件名吗?真不敢相信我花了这么长时间在这个问题上,现在这甚至不是最简单的答案。谢谢你的工作!我稍后会在我的WIN 7机器上尝试。这段代码也很有效!谢谢你做得好。你做了什么您想一想,是否可以从子文件夹中读取.pdf?子文件夹名为-ID2。@Artec,答案已更新。只需将
/r“path”
添加到
进行递归文件搜索,并将检索文件名的行更改为
%%~fz
,以获取文件的完整路径。再次感谢。效果非常好。
convert "100" -annotate "C_CCC1_C2_C3_C4" -annotate2 "055555555" -annotate4 "2015-07-07"
convert "10" -annotate "D_D1" -annotate2 "011122558" -annotate4 "2015-07-07"
convert "7" -annotate "D_D1" -annotate2 "012345678" -annotate4 "2015-07-07"
convert "8" -annotate "A" -annotate2 "087654321" -annotate4 "2015-07-07"
Beginning of line or string
[1]: A numbered capture group. [\d+]
    Any digit, one or more repetitions
_
[2]: A numbered capture group. [(?:(?:[a-zA-Z0-9]+)_?)+]
    Match expression but don't capture it. [(?:[a-zA-Z0-9]+)_?], one or more repetitions
        (?:[a-zA-Z0-9]+)_?
            Match expression but don't capture it. [[a-zA-Z0-9]+]
                Any character in this class: [a-zA-Z0-9], one or more repetitions
            _, zero or one repetitions
_
[3]: A numbered capture group. [\d{9}]
    Any digit, exactly 9 repetitions
-
[4]: A numbered capture group. [\d{4}-\d\d-\d\d]
    \d{4}-\d\d-\d\d
        Any digit, exactly 4 repetitions