[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已解决】批处理如何提取两个关键词之间的信息然后以此重命名文件名?

本帖最后由 ziranww 于 2019-2-11 13:29 编辑

非常感谢论坛里热心的朋友们,特别是@flashercs帮我几次完善了脚本,非常感谢,问题解决了
最终完善版脚本在23楼http://www.bathome.net/redirect. ... 1962&pid=217302
有类似需求的朋友可以参考一下

--------------------------------------
RT,有大量文件需要重命名,改成TXT后发现了一些规律,从其中能提取到有用的信息用于重命名文件。于是在网上查,找到了一款神奇的软件Replace Pioneer,但是研究数个小时后还是没有搞定
看了半天官网上的规则和示例,折腾了几个小时未果。于是在网上查到了论坛,求高手帮忙

需要改名的文件改成TXT打开后是这样的:
  1. 乱码
  2. abcd 乱码 name 乱码 efgh
  3. 乱码
复制代码
说明:
abcd:文件名标记信息开始
efgh:文件名标记信息结束
name:用于提取后重命名到文件名

谢谢了

用notepad++打开是这样的,红圈部分是需要提取的文件名

TOP

应该不难。但无真实信息又没有样本,又是挤牙膏的节奏。

TOP

回复 4# flashercs


    谢谢兄弟,执行后没有成功,关了echo后看到有提示

ECHO 处于打开状态。

E:\test>set "dir=E:\test"

E:\test>powershell.exe -Command "(Select-String -Path 'E:\test\*.*' -Pattern '(?<=model_name\x00)[^\x00]+(?=\x00.*?disp_out1_info)' -Encoding default)|{Rename-Item -LiteralPath $_.Path -NewName $_.Matches[0].Value}"
所在位置 行:1 字符: 119
+ ... ng default)|{Rename-Item -LiteralPath $_.Path -NewName $_.Matches[0]. ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
只允许将表达式作为管道的第一个元素。
    + CategoryInfo          : ParserError: ( [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ExpressionsMustBeFirstInPipeline

TOP

perl  python 正则表达式,写个脚本就是了

TOP

回复 6# zuodx


    这个更不会了

TOP

回复 6# ziranww

a.bat
  1. @echo off
  2. set "dir=E:\test"
  3. powershell.exe -Command "(Select-String -Path '%dir%\*.*' -Pattern '(?<=model_name\x00)[^\x00]+(?=\x00.*?disp_out1_info)' -Encoding default)|Foreach-object{Rename-Item -LiteralPath $_.Path -NewName $_.Matches[0].Value}"
复制代码

TOP

回复 7# flashercs


    兄弟,现在没有报错了,但是执行后没有改名

TOP

好像没有规律可循,不好办;因为乱码部分是随机乱码。

TOP

回复 9# flashercs


    还是谢谢兄弟了

TOP

本帖最后由 523066680 于 2019-1-30 16:55 编辑

回复 9# flashercs

    正则应该有一种占位符用来表达常见字符或者明文以外的符号。
在Perl里面是 \p{组合属性},因为Perl基本很多人没装,就不安利楼主了。

丢个砖头
  1. my $s = join('', map { chr } 0..127 );
  2. $s =~s/\p{IsCntrl}//g;
  3. print $s;
复制代码
过滤后的结果
  1. !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
复制代码
建议楼主把eps文件压缩上传到某个网盘让大家下载看看,我用ai和coreldraw导出的eps文件并没有看到类似字段,没法测试。

如果按截图中处理的话大概会这么写
~/model_name\p{IsCntrl}+(.*)\p{IsCntrl}/;
取 $1

TOP

本帖最后由 lanfogz 于 2019-1-30 17:51 编辑

我的想法:先过滤乱码,再进行处理。

有个小工具(https://pan.baidu.com/s/1jIrZ5pB9wYyaFhx70GfScw),执行“smooth 文件名”
可以把结果粘贴上来,看看效果


理想的效果是:
  1. @echo off &setlocal enabledelayedexpansion
  2. for /f %%i in ('smooth %1 ^|findstr model_name') do (
  3. set c=%%i
  4. rename %1 !c:10!
  5. goto:break
  6. )
  7. :break
复制代码

TOP

光看图片,猜测所谓的“乱码”指的是 [\x00-\x1F\x7F\x80-\xFF]
也就是 .net 正则中的 [\p{Cc}\p{IsLatin-1Supplement}]
1

评分人数

TOP

本帖最后由 flashercs 于 2019-1-31 09:58 编辑

由NULxE0NUL判断
这是utf8编码打开npp
而utf8编码下,\xE0\x00不存在编码位置,故替换为\xFFFD;
其他乱码同理:
所以文本分隔符应该是控制字符的[\x00-0x1f]和替换符\xFFFD
  1. @echo off
  2. set "dir=E:\test"
  3. powershell.exe -Command "(Select-String -Path "%dir%\*.*" -Pattern '(?<=model_name[\x00-\x1F\uFFFD]+)[^\x00-\x1F\uFFFD]+(?=[\x00-\x1F\uFFFD]*disp_outl_info)' -Encoding utf8)|Foreach-object{Rename-Item -LiteralPath $_.Path -NewName ($_.Matches[0].Value+[System.IO.Path]::GetExtension($_.Path))}"
复制代码

TOP

非常感谢论坛里热心的网友,已上传样本文件
是creo的prt文件

通过winhex打开看到情况是这样的,我现在通过replace pineer这个软件处理了一下文件,只能通过固定数量字符窜长度实现了一部分文件的提取后重命名,但是还是不完美,发现里面有许多文件命名长度不一样,最完美的是过滤掉乱码,提取两个字符中间的内容

TOP

返回列表