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

[文本处理] 批处理:if-变量值输出到文本的问题

请专家指引一下哦
①代码运行echo;"!tet:~0,2!"显示:“C:”,我该如何补全“ if "!tet!"=="!tet~0,2!" echo %%i ”,才能打印输出到txt文本呢?
②如果我要保留原文件的空行、格式不变,本代码又该怎么修改?
你的任何帮助对我都是有用的。谢谢!
代码如下:
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b /a-d /s *.txt') do (
set "tet=%%i"
if "!tet!"=="!tet:~0,2!" echo %%i >> 3.txt
echo;"!tet:~0,2!"
)
pause
批处理我不会多嘛!

回复 39# qixiaobin0715
感谢你的回复!
    感谢专家,智慧无量,笔下代码新颖,成功运行。也许在代码程序家的眼里是一小酌,但却彰显了批处理之家成员的品味,真诚赞贺!
谢谢!

TOP

回复 38# WBATW
  1. @echo off
  2. set var="25" "" " " "  " " " " " "@)" ")" "@)" ")"
  3. for %%i in (%var%) do set _%%i=true
  4. for /f "delims=" %%i in ('dir /s /b /a-d *.txt') do (
  5.     (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%%i"') do (
  6.         if defined _"%%b" (
  7.             echo,%%b
  8.         ) else (
  9.             set str=%%b
  10.             setlocal enabledelayedexpansion
  11.             if not "!str:~2!"=="" echo,%%b
  12.             endlocal
  13.         )
  14.     ))>temp.log
  15.     move /y "temp.log" "%%i"
  16. )
  17. pause
复制代码
bat文件保存为ANSI编码,请自行测试。

TOP

回复 37# qixiaobin0715
非常感谢你列出的清单详细,中英文都包括了,完全正确。不知道代码有难度没有。

TOP

本帖最后由 qixiaobin0715 于 2022-11-1 15:12 编辑

回复 35# WBATW
根据你的描述,我帮你列一下要保留的清单,你看看是不是这样,共10种情况:
  1. 25
  2.   
  3. @)
  4. @)
  5. )
复制代码

TOP

回复 35# WBATW
难道我在34楼还没说清楚?
如果自己要修改代码,请看第3点;
如果想要我帮你修改代码,请再仔细看看第1、2点。

TOP

本帖最后由 WBATW 于 2022-11-1 14:24 编辑

回复 34# qixiaobin0715
哦~
好的,谢谢!
    也许是我描述过细反而不利于理解。
其实就是英文半角状态的“@)”字符、“)”【不包括引号】括号字符获取不到。最好保留所有的空行。【顺便说明:中文字符状态下效果非常棒】。
    这是我用32楼代码的测试文件:1.txt,请批处理专家qixiaobin0715 试测,谢谢!
------------------------------------
我的测试字符为英文:
25
@)
)
第4行空格空行
最好是能够保留原文件原有的空行。
(32楼代码中的变量需要修改或者增加一个_)=1)
-----------------------------------

TOP

本帖最后由 qixiaobin0715 于 2022-10-28 11:45 编辑

你还是没把问题说清楚,最好能将 要保留的少于3个字符的所有特例列个清单(要真实),便于帮助你的人测试用。
1.你可以把清单存入文本文件,发到网盘上;
2.还可以把清单直接发到帖子上,不要“..”  “.”  “..”这种,也不要这种:
..
.
..
需要别人给你的代码那样:
  1. ..
  2. .
  3. ..
复制代码
3.也可以采用最直接的办法,对32楼代码进行修改:
a)去掉第3行的预设变量;
b)修改判断语句,穷尽你所要保留的各种可能(使用多个else if这种形式):
  1. if ... (
  2. ...
  3. ) else if...(
  4. ...
  5. ) else if...(
  6. ...
  7. ) else (
  8. ...
  9. )
复制代码

TOP

回复 32# qixiaobin0715

恭喜恭喜,这个思路很好,测试基本成功!
辛苦了,qixiaobin0715 !
    测试过程发现:
    代码设置字符“@)”为中文时,测试文件中有英文“@)”和中文“@)”字符,中文“@)”可以成功获取(英文的“@)”获取不到);
    代码设置字符“@)”为英文时,此时,英文字符获取不到、中文的也获取不到。如何修改代码来解决这个难题呢,另外,回车换行的空行保留了而有空格的空行(Tab空行)会被去除掉,可否挽留呢!还要费专家心思了,谢谢!

TOP

回复 29# WBATW
应用上面链接帖子中第2个代码,保留文本中字符为“@)”“25”的行及空行。代码保存为ANSI编码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a _@)=1,_25=1
  4. for /f "delims=" %%i in ('dir /s /b /a-d *.txt') do (
  5.     (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%%i"') do (
  6.         if "!_%%b!"=="1" (
  7.             echo,%%b
  8.         ) else if "%%b"=="" (
  9.             echo,
  10.         ) else (
  11.             set str=%%b
  12.             if not "!str:~2!"=="" echo,%%b
  13.         )
  14.     ))>temp.log
  15.     move /y "temp.log" "%%i"
  16. )
  17. pause
复制代码
代码未经测试,请自行测试,有问题再讨论。

TOP

本帖最后由 qixiaobin0715 于 2022-10-26 10:34 编辑

回复 29# WBATW
你所谓的新功能实现起来应当不难,只需要预先设置几个有关变量,然后读取文本内容时加以判断即可。“本目录”是3个字符,本来就不会被排除。

TOP

回复 29# WBATW
可参考这个帖子,对28楼代码进行修改:
http://bbs.bathome.net/viewthrea ... D%D1%F9%CA%E4%B3%F6

TOP

本帖最后由 WBATW 于 2022-10-25 15:39 编辑

回复 28# fzp070
谦虚了____
还是要感谢你的回复!
    首先肯定你的思路开阔,考虑细腻,代码注释说明,条理清楚近逼完美,惯习以常,毕慧聚自成,盛器也!
(我们技术人机械人一般都,说1不2,看上去简练精准没有多余的“废话”而很有知识,但却丢失了另外一样重要的东西__沟通交流的文化。就像是有骨架没有血肉,就会远离对方的亲近感而丢失沟通交流的机会,代码是知识注释是文化....哈哈哈...扯远了)书归正传:
    代码测试一次成功,还有就是输出的新文件没有保留原格式,会把原来的空行去除了,可否通过修改代码保留原来格式;你这代码提示我想起一个新功能:某些特定的多个字符和符号比如:“本目录”“@)”“25”等等之类也提取到输出文件。这样的话可以防止虽然是小于3字符但是又需要保留的不被去除。谢谢!

TOP

回复 21# WBATW


    客气了,相互学习!
    13楼的代码只提供了[提取少于3个字符数的行内容]。
如下代码是去除少于3个字符的行内容,并保存至文本所在目录,和文本相同名-1.txt文档内(也可以保存在同一个文档内,自己改下)。
  1. @echo off&setlocal EnableDelayedExpansion
  2. set j=1
  3. ::获取批处理目录及子目录所有txt文本
  4. for /f "delims=" %%i in ('dir /b /a-d /s *.txt') do (
  5. set "tet=%%i"
  6. rem 提取文本路径、文件名、文件后缀
  7. for %%I in ("!tet!") do (set fp=%%~dpI&set fn=%%~nI&set fx=%%~xI)
  8. echo 正在处理文本!j!:!fn!!fx!
  9. rem 对文本每行进行字符数判断,保留3个字符及以上的行内容,输出至文本同名-1.txt的文档内
  10. for /f "tokens=1 delims=" %%a in ('findstr .* "!tet!"') do (
  11.     set tempa=%%a
  12.         if not "!tempa:~2,1!"=="" echo %%a>>"!fp!!fn!-1!fx!"
  13. )
  14. set /a j+=1
  15. )
  16. echo 运行完成
  17. pause
  18. exit
复制代码

TOP

回复 15# Batcher


    好的,谢谢提示!

TOP

返回列表