找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 26517|回复: 12

[文本处理] 批处理如何从文本中提取文件路径

[复制链接]
发表于 2016-11-7 14:58:53 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-11-7 15:09 编辑

有一个文本文件如下:
sending incremental file list
deleting test.com/web/测试 包含空格/中文名.txt
deleting test.com/web/测试 包含空格/
deleting test.com/web/new file/test.txt
deleting test.com/web/new file/
deleting test.com/web/index.php
deleting test.com/web/index.html
deleting test.com/web/
deleting test.com/log/
deleting test.com/data/
deleting test.com/
./
baidu.com/web/

sent 717 bytes  received 299 bytes  2,032.00 bytes/sec
total size is 52  speedup is 0.05 (DRY RUN)



文中有目录路径,文件路径,只需要取得文件路径,现在需要得到的结果是:
test.com/web/测试 包含空格/中文名.txt
test.com/web/new file/test.txt
test.com/web/index.php
test.com/web/index.html
请教各位批处理该如何写?

评分

参与人数 1PB -2 收起 理由
pcl_test -2 发帖前先使用论坛搜索

查看全部评分

发表于 2016-11-7 15:10:09 | 显示全部楼层
发表于 2016-11-7 15:23:09 | 显示全部楼层
回复 1# 刘伶闯天台
  1. set a=!a:~8!
复制代码
?

评分

参与人数 1技术 +1 收起 理由
刘伶闯天台 + 1 谢谢

查看全部评分

 楼主| 发表于 2016-11-7 15:27:23 | 显示全部楼层
回复 2# pcl_test
不好意思版主,我先想想。
 楼主| 发表于 2016-11-7 18:54:00 | 显示全部楼层
本帖最后由 pcl_test 于 2016-11-7 20:05 编辑

回复 2# pcl_test
版主你好,写了个批处理现在应该可以达到效果。
文本123.txt内容如下,文本中以【/】结束的都表示的是目录。
批处理代码:

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. findstr "deleting" 123.txt > tmp.txt
  4. for /f "tokens=1,*" %%i in (tmp.txt) do (
  5.     set str=%%j
  6. ::    echo !str:~-1!
  7.     if not "!str:~-1!"=="/" echo %%j
  8. )
  9. pause
复制代码
得到结果如下:

  1. test.com/web/娴嬭瘯 鍖呭惈绌烘牸/涓?枃鍚?txt
  2. test.com/web/x.y/x.y.txt
  3. test.com/web/new file/test.txt
  4. test.com/web/dd/fff   .txt
  5. test.com/web/index.php
  6. test.com/web/index.html
  7. 请按任意键继续. . .
复制代码
1.先使用findstr在123.txt中查找包含【deleting】的行重定向到tmp.txt文件中;
2.然后使用for循环,以默认空格分隔,当切分完第一节之后,切分动作不再继续下去,因为 tokens=1,* 中,星号前面紧跟的是数字1;第一节字符串被切分完之后,其余部分字符串不做任何切分,整体作为第二节字符串,这样,一行就被切分成了两节,分别被变量%%i和变量%%j接收。然后就是判断最后一个字符是不是【/】,如果不是就认为是文件。

虽然可以实现了,对批处理不是很熟悉,请教版主在此例中分辨路径是文件还是目录还有其他方法吗?(结果中的中文乱码可能是因为123.txt文件为UTF-8编码格式,但是findstr重定向后的文件也是UTF-8格式?)
发表于 2016-11-7 20:10:03 | 显示全部楼层
回复 5# 刘伶闯天台

不是本地文件,只好通过路径的特征取区分;有可能是utf-8的
 楼主| 发表于 2016-11-7 20:28:08 | 显示全部楼层
回复 6# pcl_test
非常感谢,批处理没有什么问题吧?我能想到的就只是通过看最后一位字符是不是【/】来判断了。
发表于 2016-11-7 20:53:30 | 显示全部楼层
回复 7# 刘伶闯天台


要选出文件、过滤掉目录,可以把 findstr 命令改成
  1. findstr "^deleting.*[^/]$"
复制代码

评分

参与人数 1技术 +1 收起 理由
刘伶闯天台 + 1 感谢分享

查看全部评分

发表于 2016-11-8 00:14:38 | 显示全部楼层
  1. mshta http://bathome.net/s/hta/index.html "type('文本.txt').match(/\bdeleting\b.+[^/\s](?=\s*(\r\n|$))/g).EACH(function(a){return a.replace(/^\S+\s+/,'')}).join('\r\n')"
  2. pause
复制代码

  1. powershell -c "gc '文本.txt'|%%{if($_ -match '^\s*deleting\s+(.+?[^/])\s*$'){$matches[1]}}"
  2. pause
复制代码
发表于 2016-11-8 00:39:35 | 显示全部楼层
  1. mshta http://bathome.net/s/hta/index.html "type('文本.txt').split(/\r?\n/).grep(/^deleting /).join('\r\n').replace(/^.+?\s+/gm,'')"
复制代码
 楼主| 发表于 2016-11-8 11:40:02 | 显示全部楼层
回复 8# DiamondbacK

非常感谢,学习了。
 楼主| 发表于 2016-11-8 11:41:00 | 显示全部楼层
回复 9# pcl_test

多谢,我先学习学习。
 楼主| 发表于 2016-11-8 11:41:19 | 显示全部楼层
回复 10# CrLf

非常感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:26 , Processed in 0.035106 second(s), 16 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表