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

[文本处理] [已解决]批处理怎么删除不同文件夹中的文本文件中的#连同#之内的字符与文本#?

[复制链接]
发表于 2023-11-24 19:51:35 | 显示全部楼层 |阅读模式
本帖最后由 cxq00 于 2024-9-26 18:14 编辑

怎么批量处理同一目录下不同文件夹中的文本文件中的#连同#之内的字符与文本#

原文本是这样的:
总而言之,很多学校食堂阿姨都有手抖的毛病,所以遇到这种情况时,就别再责怪食堂阿姨了,她们也是有苦衷的!
所以,我们都是打工人,都相互体谅一下吧!#校园食堂趣事# #大学生食堂贵吗# #食堂的那些事# #学校饭菜加价# #你喜欢吃食堂吗#



我要的效果是删除掉包含##这其中的文字:

总而言之,很多学校食堂阿姨都有手抖的毛病,所以遇到这种情况时,就别再责怪食堂阿姨了,她们也是有苦衷的!
所以,我们都是打工人,都相互体谅一下吧!

解决方案:
powershell -c "dir -Directory|dir -Filter \"*.txt\"|foreach{(gc $_.FullName) -replace '#.*?#'|sc $_.FullName}"

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-11-24 21:52:46 | 显示全部楼层
回复 1# cxq00


请给一个真实的例子说明一下你的需求吧,比如操作之前是怎样的,操作之后变成啥样?
如果需要上传文件,请用使用网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
 楼主| 发表于 2023-11-25 16:58:48 | 显示全部楼层
回复 2# Batcher


    原文本是这样的:
总而言之,很多学校食堂阿姨都有手抖的毛病,所以遇到这种情况时,就别再责怪食堂阿姨了,她们也是有苦衷的!
所以,我们都是打工人,都相互体谅一下吧!#校园食堂趣事# #大学生食堂贵吗# #食堂的那些事# #学校饭菜加价# #你喜欢吃食堂吗#



我要的效果是删除掉包含##这其中的文字:

总而言之,很多学校食堂阿姨都有手抖的毛病,所以遇到这种情况时,就别再责怪食堂阿姨了,她们也是有苦衷的!
所以,我们都是打工人,都相互体谅一下吧!
发表于 2023-11-25 17:36:57 | 显示全部楼层
将当前目录下若干文件夹的txt文件中由一对#包裹的字符串及该对#删除
  1. powershell -c "dir -Directory|dir -Filter "*.txt"|foreach{(gc $_.FullName) -replace '#.*?#'|sc $_.FullName}"
复制代码
 楼主| 发表于 2023-11-25 17:47:53 | 显示全部楼层
回复 4# buyiyang


   大佬, 这个怎么使用
 楼主| 发表于 2023-11-25 17:54:05 | 显示全部楼层
回复 4# buyiyang


    我只会bat文件,你这个是直接用powershell吗?  感谢您的回复
发表于 2023-11-25 22:53:46 | 显示全部楼层
回复 1# cxq00


    同问
发表于 2023-11-25 22:55:26 | 显示全部楼层
本帖最后由 /zhqsystem/zhq 于 2023-11-25 23:04 编辑
  1. rem 特别说明:#号不能连续,又发现一处错误#也不能在开始字段,凑合用吧,来回减字符数字实在是烧脑
  2. if /i "%~f1"=="" echo,错误请拖拽运行或是调用[+路径]运行&timeout.exe /t 10&exit
  3. >"%~f1.tmp" (
  4.   for /f "delims=" %%i in ('type "%~f1"')do (
  5.    set "#=%%i"
  6.    call:1
  7.    call:2 "%~f1"
  8.   )
  9. )
  10. goto:eof
  11. :1
  12. for /l %%n in (0,1,8192)do if /i "!#:~%%n,1!"=="" set/a "$_All=%%n"&&goto:eof
  13. goto:eof
  14. :2
  15. set "n=0"
  16. for /l %%n in (0,1,!$_All!)do if /i "!#:~%%n,1!"=="#" set/a "n+=1"&&set "$_!n!=%%n"
  17. set/a "o=!n!%%2"
  18. if /i "!o!"=="0" (call:3)else (echo,!#!)&&rem 符号不成组直接导出
  19. goto:eof
  20. :3
  21. set "#_tmp=!#!"
  22. set/a "nn=!n!+2"&&rem 修正段
  23. for /l %%n in (1,1,!nn!)do if defined #_tmp for /f "tokens=1,2,* delims=#" %%x in ("!#_tmp!")do (
  24.   if /i not "%%y"=="" set "#_tmp=%%x%%z"
  25. )
  26. echo,!#_tmp!
  27. goto:eof
复制代码
发表于 2023-11-25 23:29:15 | 显示全部楼层
回复 5# cxq00


    上面的代码保存到一个.bat文件里运行就行
 楼主| 发表于 2023-11-26 09:58:25 | 显示全部楼层
回复 8# /zhqsystem/zhq


   谢谢您的帮助,我去试试
 楼主| 发表于 2023-11-26 09:58:34 | 显示全部楼层
回复 9# pd1


    好的,非常感谢
 楼主| 发表于 2023-11-26 10:07:49 | 显示全部楼层
回复 9# pd1


    请问下这个是什么语言写的
发表于 2023-11-26 11:05:20 | 显示全部楼层
回复 12# cxq00


    4楼的代码是在BAT脚本里面调用的PowerShell
 楼主| 发表于 2023-11-26 18:21:08 | 显示全部楼层
回复 13# ShowCode


    哦哦,好的,谢谢!!
发表于 2023-11-27 15:52:53 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-6-6 22:31 编辑


一。不写一堆纯P代码,就要用其他手段代劳。系统原装的 jscript 或外部资源如 python、sed.exe 等可以逐步简化一楼示例的解法》
以下6行代码存为批处理脚本运行》cmd+jscript混编

  1. @set @v=1 /*
  2. @echo off
  3. for /f "delims=" %%F in ('dir/b/s/a-d *.txt') do (type "%%~F"|cscript /e:javascript "%~f0">"%%~F.new")
  4. exit/b
  5. */
  6. lines=WSH.stdin.readall().replace(/#[^#]*#/g, ''); WSH.echo(lines);
复制代码
以下5行代码存为批处理脚本运行》假设系统已经预装python

  1. @echo off
  2. for /f "delims=" %%F in ('dir/b/s/a-d *.txt') do (
  3.         type "%%~F"|python -c "import sys,re;s=sys.stdin.read();print(re.sub('#[^#]*#','',s,re.S))">"%%~F.new"
  4. )
  5. exit/b
复制代码
以下2行代码存为批处理脚本运行》假设sed.exe已被下载安装在系统路径

  1. @echo off &for /f "delims=" %%F in ('dir/b/s/a-d *.txt') do (sed "s/#[^#]*#//g" "%%~F">"%%~F.new")
  2. exit/b
复制代码
二。再给一段纯P代码》未发现内置的字符串操作捷径,只能用纯P的基本方法,先获取字符串长度再逐字判断以求目标结果... 此法虽然基本但确有灵活性,可有多种字符串处理用途。
以下代码存为批处理脚本运行》

  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "delims=" %%F in ('dir/b/s/a-d *.txt') do (
  3.         (for /f "usebackq delims=" %%s in ("%%~F") do (
  4.                 set "cut=-1" &set "_s=" &set "s=%%~s" & (call :_strLen s sl)
  5.                 for /L %%i in (0,1,!sl!) do (
  6.                         set "c=!s:~%%i,1!"
  7.                         if "!c!" neq "#" (if !cut! equ -1 set "_s=!_s!!c!") else (set/a "cut=0-!cut!")
  8.                 )
  9.                 echo,!_s!
  10.         ))>"%%~F.new"
  11. )
  12. endlocal&exit/b

  13. :_strLen //获取字符串长度(须开启变量延迟可保全^!等字符) %1=字符串变量名 %2=返回值变量名
  14.    set "_str=_!%~1!" &set "_Len=0"
  15.    for %%n in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  16.       if "!_str:~%%n,1!" neq "" (set/a "_Len+=%%n"&set "_str=!_str:~%%n!")
  17.    )
  18.    set "%~2=!_Len!" &exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 19:41 , Processed in 0.023020 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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