Board logo

标题: [文本处理] 批处理怎样截取文本中路径? [打印本页]

作者: freesoft00    时间: 2015-6-1 12:48     标题: 批处理怎样截取文本中路径?

本帖最后由 freesoft00 于 2015-6-1 20:46 编辑

"Program Files (x86)\Internet Explorer\iexplore.exe"
"Program Files (x86)\Internet Explorer\F12Tools.dll"
"Program Files (x86)\Internet Explorer\ie9props.propdesc"
"Program Files (x86)\Internet Explorer\iedvtool.dll"
"Program Files (x86)\Internet Explorer\ieinstal.exe"
"Program Files (x86)\Internet Explorer\ielowutil.exe"
"Program Files (x86)\Internet Explorer\ieproxy.dll"
"Program Files (x86)\Internet Explorer\IEShims.dll"
Windows\System32\amdocl_ld64.exe
Windows\System32\amdocl64.dll
Windows\System32\amdmmcl6.dll
Windows\System32\amdocl_as64.exe

上面是1.txt中文本的样例,我需要截取路径和文件名称。
  1. @echo off
  2. pushd %~dp0
  3. for /f "delims=" %%i in (1.txt) do (
  4.     echo,%%~dpi333%%~nxi%
  5. )>>3.txt
  6. pause
复制代码
如果使用上面对代码,文件名称截取对了,但是路径不对,路径变为了绝地路径,
比如这个文本1.txt在e:\22\33目录存放,
批处理运行完成后解决的路径都是
e:\22\33\Program Files (x86)\Internet Explorer\333iexplore.exe
而不是我要的下面的解决
Program Files (x86)\Internet Explorer\333iexplore.exe

另外一个问题,如果路径中带有引号的,希望生成后继续有双引号,如果不带有双引号的,那么还保持不带有双 引号


现在的问题:
文本的路径中有*号的处理不正确,
c:\4444\*
"c:\5555\*"
最后通过下面兄弟的代码得到的是
#:*= 333 *
#:*= 333 *

所以不再对带有*号的做处理,批处理在判断末尾是*号的不再生成到3.txt文本中,就是过滤掉。
同时过滤到开头是:冒号的行,比如:
:Windows\System32\amdocl64.dll
这个就不再生成到3.txt文本中
作者: tmplinshi    时间: 2015-6-1 17:56

  1. sed -r "s/[^\\]+$/333\0/" a.txt > 3.txt
复制代码
点击我签名中的链接下载 sed.exe
作者: freesoft00    时间: 2015-6-1 18:25

回复 2# tmplinshi


    感谢,有不用sed,纯批处理或者vbs也可以能解决吗
作者: yangfengoo    时间: 2015-6-1 18:42

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=*" %%a in (1.txt) do (
  4.   set #=%%a
  5.   set #=!#:%cd%=!
  6.   echo,!#:%%~nxa=! 333 %%~nxa
  7.   
  8.   )
  9.   
  10. pause
复制代码

作者: freesoft00    时间: 2015-6-1 18:44

回复 4# yangfengoo


    好的,再次感谢楼上的两位
作者: Bella    时间: 2015-6-1 18:58

本帖最后由 Bella 于 2015-6-1 22:36 编辑
  1. sed -r "/^:|\*\x22?$/d;s/[^\]+$/333&/" 1.txt>3.txt
复制代码

作者: freesoft00    时间: 2015-6-1 20:30

回复 6# Bella

感谢提供代码!
作者: freesoft00    时间: 2015-6-1 20:36

回复 6# Bella


名称中不能有*号,比如文本的路径是
“c:\win\*"
最后得到的结果是
"333*"
作者: freesoft00    时间: 2015-6-1 20:40

回复 4# yangfengoo

也有同样的问题,路径中不能有*号
c:\4444\*
"c:\5555\*"
最后得到的结果是
#:*= 333 *
#:*= 333 *


主要是我没有把文本的内容说清楚的问题。
作者: freesoft00    时间: 2015-6-1 20:41

在遇到有*号结尾的不做更改也不添加到新的文本中。
作者: freesoft00    时间: 2015-6-1 20:53

文本:
4444\*
4444\*.exe
"5555\3*.exe"
4444\555.*

结果:
333*
333*.exe
"5555\3333*.exe"
4444\333555.*

似乎是对目录的\线后面不能是*号,否则前面的路径就没有了,只剩文件名了。
作者: terse    时间: 2015-6-1 22:54

  1. @if(0)==(0) echo off & cscript -NoLogo -E:JScript %0 <1.txt "333" >3.txt & pause & exit @end
  2. var re = /(.*?)([^\\]*$)/;
  3. var s = WScript.Arguments.Item(0);
  4. while(!WScript.StdIn.AtEndOfStream){
  5.     var str = WScript.StdIn.ReadLine();
  6.     WSH.Echo(str.replace(
  7.        re, function(a,b,c) {return(b+s+c)}
  8.     ));
  9. }
复制代码

作者: /zhqsystem/zhq    时间: 2015-6-17 02:52

本帖最后由 /zhqsystem/zhq 于 2015-6-17 02:58 编辑

for /f "tokens=* delims=" %%i in (1.txt) do (
echo=%%i   完整数据
echo=%%~nxi   截取名称和扩展名
echo=%%~dpi   提取路径[带盘符]
echo=%%~pi    提取路径[无盘符]
echo=%%~di    提取盘符[无\]
)
置于保留引号是个问题,没有引号会更好用变量加个引号就可以解决,




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2