Board logo

标题: [文本处理] [已解决]批处理获取文件路径删除被拖放的文件夹部分 [打印本页]

作者: 2013koko    时间: 2021-5-6 19:44     标题: [已解决]批处理获取文件路径删除被拖放的文件夹部分

本帖最后由 2013koko 于 2021-5-7 17:51 编辑

请教各位坛友:
@echo off
setlocal enableDelayedExpansion
if "%~1"=="" echo,请拖放文件夹到本文件上&pause&exit /b
dir /a-d /b /s /og "%~1" >"%~dp0file.txt"
dir /ad /b /s /og "%~1" >"%~dp0folder.txt"
copy folder.txt + file.txt folderfile.txt
这个批处理是拖放文件夹获取文件列表和目录列表
但这个生成的文件列表是带绝对路径的,如:D:\TEST\被拖放的文件夹\...,现在想去除其中的“D:\TEST\被拖放的文件夹\”部分,请问该如何做?感谢!
作者: xp3000    时间: 2021-5-6 20:15

改为dir /b/a-d/on %file%\* >%~dp0%outfile%
作者: 2013koko    时间: 2021-5-6 20:36

回复 2# xp3000


这个无效,还是带路径
作者: cutebe    时间: 2021-5-6 20:53

/s要去掉,这是包含子目录并且输出是完整路径。
  1. dir/a-d/b/og "%~1">"%~dp0outfile.txt"
复制代码

作者: xp3000    时间: 2021-5-6 21:04

  1. @echo off
  2. if "%~1"=="" echo,请拖入文件夹到本文件上&pause&exit /b
  3. for %%i in (%*) do (
  4. for /f "delims=" %%j in ('"dir /a/s/b/on %%i"') do (
  5. echo %%~nxj
  6. ))>>名称.txt
  7. pause
复制代码
我试了没问题
作者: 2013koko    时间: 2021-5-6 22:00

回复 5# xp3000


    是我没有说清楚,这个用了/s,子目录的路径还是要保留的,只是想去除“d:\test\拖入文件夹\
这个其实打开文档查找、替换为空就可以完成,只是如果能用批处理一步到位当然更好!感谢您的回复!
作者: 2013koko    时间: 2021-5-6 22:03

回复 4# cutebe


    本来就是为了获取所有目录下的文件名,这是前设,
作者: newswan    时间: 2021-5-6 22:47

  1. @echo off
  2. setlocal enableDelayedExpansion
  3. if "%~1"=="" echo,请拖入文件夹到本文件上&pause&exit /b
  4. for /f "usebackq" %%a in (`Powershell -c "'%1'.Length"`) do (
  5.     set /a n=%%a+1
  6. )
  7. for /f "delims=" %%j in ('"dir /a/s/b/on %1"') do (
  8.     set str=%%~j
  9.     set str=!str:~%n%!
  10.     echo !str!
  11. )
  12. pause
  13. 得到全路径,截取
复制代码

作者: cutebe    时间: 2021-5-6 23:17

  1. (for /f "delims=" %%a in ('dir/a-d/b/s/og "%~1"')do @echo %%~nxa)>"%~dp0outfile.txt"
复制代码

作者: 2013koko    时间: 2021-5-7 10:49

回复 9# cutebe

这个子目录路径没有显示
我的意图是只删除被拖放目录之前部分的路径
另一个思路,能否对前面输出全路径的文档file1.txt进行再处理,删除路径?

被拖动文件夹路径可以用如下方法获取
::被拖动文件夹路径=%~dp1%~nx1
set wjlj=%~dp1%~nx1

但以下方法没有成功去除
for /f "delims=" %%i in (file1.txt) do (
set var=%%i
set var=!var:%wjlj%=!
echo !var!>>file.txt

请问有没有好的方法?谢谢!
作者: 2013koko    时间: 2021-5-7 11:00

回复 8# newswan

这个很接近我的意愿,但这个怎么把结果输出到文件?
另外输出结果中多了子目录信息,如下(上两行希望不出现在输出结果中):
EBWebView\x64
EBWebView\x86
EBWebView\x64\EmbeddedBrowserWebView.dll
EBWebView\x86\EmbeddedBrowserWebView.dll
作者: newswan    时间: 2021-5-7 11:31

  1. @echo off
  2. setlocal enableDelayedExpansion
  3. for /f "usebackq" %%a in (`Powershell -c "'%1'.Length"`) do (
  4.     set /a n=%%a+1
  5. )
  6. for /f "usebackq delims=" %%a in (` dir /a/s/b/on %1 ^| findstr /v "EBWebView" `) do (
  7.     set str=%%~a
  8.     set str=!str:~%n%!
  9.     echo !str!
  10. ) > list.txt
复制代码

作者: newswan    时间: 2021-5-7 11:33

本帖最后由 newswan 于 2021-5-7 11:37 编辑

过滤子目录,要或不要,用白名单或者黑名单
作者: cutebe    时间: 2021-5-7 12:23

回复 10# 2013koko三方工具可从论坛下载:sed.exe

开始会错意,现在搞清了!
  1. dir/a-d/b/s/og "%~1">"%~dp0%~n1_filelist.txt"
  2. set "dirstr=%~1\"
  3. sed -i "s/^%dirstr:\=\\%//" "%~dp0%~n1_filelist.txt"
复制代码

作者: 2013koko    时间: 2021-5-7 13:01

回复 14# cutebe

还是差一线,请再看一下,谢谢!

以下是输出的部分内容,现在想删除每行中的“D:\Software\Office 2010\”这一段,其余均保留

D:\Software\Office 2010\+)激活备份还原.cmd
D:\Software\Office 2010\-)卸载.cmd
D:\Software\Office 2010\!)安装.cmd
D:\Software\Office 2010\icons\GRAPH.ICO
D:\Software\Office 2010\icons\misc.exe
D:\Software\Office 2010\icons\MSOICONS.EXE
D:\Software\Office 2010\icons\PPTICO.EXE
D:\Software\Office 2010\icons\WORDICON.EXE
D:\Software\Office 2010\icons\XLICONS.EXE
D:\Software\Office 2010\icons\ACCICONS.EXE
D:\Software\Office 2010\Office14\ACCDDS.DLL
D:\Software\Office 2010\Office14\ACCDDSF.DLL
D:\Software\Office 2010\Office14\ACCDDSLM.DLL
D:\Software\Office 2010\Office14\ACCVDT.DLL
D:\Software\Office 2010\Office14\ACCWIZ.DLL
D:\Software\Office 2010\Office14\ACEDAO.DLL
D:\Software\Office 2010\Office14\AUTHZAX.DLL
作者: 2013koko    时间: 2021-5-7 13:10

回复 12# newswan

这个似乎不对,试了多个文件夹 都只显示一行:smart-art\quickstyle\simple5.xml
作者: cutebe    时间: 2021-5-7 13:28

回复 15# 2013koko

我试了已经可以了。
sed.exe放在批处理同目录,搜索下载:http://www.bathome.net/s/tool/index.html
作者: 2013koko    时间: 2021-5-7 13:46

回复 17# cutebe


用三方工具确实可以了,谢谢!
请教不用工具,批处理删除文本中的字符串能够实现吗?
作者: newswan    时间: 2021-5-7 14:24

  1. @echo off
  2. setlocal enableDelayedExpansion
  3. for %%a in (%*) do (
  4.     call :f1 %%a
  5. )
  6. goto :END
  7. :f1
  8. for /f "usebackq" %%a in (`Powershell -c "'%1'.Length"`) do (
  9.     set /a n=%%a+1
  10. )
  11. for /f "usebackq delims=" %%a in (` dir /a/s/b/on %1 `) do (
  12.     set str=%%~a
  13.     set str=!str:~%n%!
  14.     echo !str!
  15. )
  16. goto :eof
  17. :END
  18. pause
复制代码
支持多个文件夹
作者: cutebe    时间: 2021-5-7 15:43

本帖最后由 cutebe 于 2021-5-7 15:44 编辑

不用三方会稍微复杂点。
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. set "str=%~1"
  4. set dn=1
  5. :snlp
  6. if "!str:*\=!" neq "" (
  7. set/a dn+=1
  8. set "str=!str:*\=!"
  9. if "!str:*\=!" neq "!str!" goto :snlp
  10. )
  11. setlocal disableDelayedExpansion
  12. (for /f "tokens=%dn%* delims=\" %%q in ('dir/a-d/b/s/og "%~1"')do echo %%r)>"%~dp0%~nx1_filelist.txt"
复制代码

作者: went    时间: 2021-5-7 16:57

支持一次性拖动多个文件夹到bat上,ansi保存
  1. @echo off
  2. if "%~1"=="" echo,请拖放文件夹到本文件上 &pause&exit
  3. :loop
  4. echo %~1
  5. (
  6. for /r "%~1" %%i in (*) do (
  7. call set "p=%%~i"
  8. call set "p=%%p:%~1\=%%"
  9. call echo %%p%%
  10. )
  11. )>"%~nx1.txt"
  12. echo %~nx1.txt
  13. echo done.
  14. echo ---------------
  15. shift /1
  16. if not "%~1"=="" goto :loop
  17. pause&exit
复制代码

作者: went    时间: 2021-5-7 17:00

回复 21# went


    要生成到bat文件夹就把第一行@echo off改为
  1. @echo off & cd /d "%~dp0"
复制代码

作者: 2013koko    时间: 2021-5-7 17:40

回复 19# newswan


    这个批处理运行后得到的是文件列表+目录列表。能否文件列表一个输出,文件目录一个输出?谢谢!
作者: 2013koko    时间: 2021-5-7 17:49

回复 20# cutebe


这个完美!批处理多大?比三方小多了,并且一个文件就ok!
作者: 2013koko    时间: 2021-5-7 18:23

回复 21# went

这个也能达到目的,可惜不知为何不能评分,谢谢!




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