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

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

本帖最后由 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
请教各位批处理该如何写?
1

评分人数

    • pcl_test: 发帖前先使用论坛搜索PB -2

回复 10# CrLf

非常感谢。

TOP

回复 9# pcl_test

多谢,我先学习学习。

TOP

回复 8# DiamondbacK

非常感谢,学习了。

TOP

  1. mshta http://bathome.net/s/hta/index.html "type('文本.txt').split(/\r?\n/).grep(/^deleting /).join('\r\n').replace(/^.+?\s+/gm,'')"
复制代码

TOP

  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
复制代码

TOP

回复 7# 刘伶闯天台


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

评分人数

TOP

回复 6# pcl_test
非常感谢,批处理没有什么问题吧?我能想到的就只是通过看最后一位字符是不是【/】来判断了。

TOP

回复 5# 刘伶闯天台

不是本地文件,只好通过路径的特征取区分;有可能是utf-8的

TOP

本帖最后由 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格式?)

TOP

回复 2# pcl_test
不好意思版主,我先想想。

TOP

回复 1# 刘伶闯天台
  1. set a=!a:~8!
复制代码
?
1

评分人数

TOP

TOP

返回列表