Board logo

标题: [其他] 求助批处理如何将FindStr的结果输出给Set 呢? [打印本页]

作者: smatenchen    时间: 2022-11-12 00:24     标题: 求助批处理如何将FindStr的结果输出给Set 呢?

本帖最后由 smatenchen 于 2022-11-13 10:16 编辑



求助,如何将FindStr的结果输出给Set 呢?


1,
如何将,
  1. Echo 12345 | FindStr /B /I 123
复制代码
的结果输出给 Set aaa= 呢?


2,
当然,可以借助For /F 命令把结果输出,类似 Set aaa=%%a。


3,
请问大神,有无更简便的方法呢?
类如,
  1. Set aaa=<(Echo 12345 | FindStr /B /I 123)
复制代码
,这样的命令,有吗?
我试过了,行不通,结果是找不到文件。


4,
请大神帮忙!
非常感谢!


作者: smatenchen    时间: 2022-11-12 00:28

回复 1# qixiaobin0715 hfxiang idwma BAT221110


1,
请大神帮忙!
非常感谢!
作者: 77七    时间: 2022-11-12 08:38

http://www.bathome.net/thread-51954-1-1.html

参考此贴六楼,不知道对你有没有帮助
作者: qixiaobin0715    时间: 2022-11-12 09:09

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

不要突发奇想了,这条路行不通。多条命令是通过管道(|)或者组合命令(&、&&、||等)来进行连接的,你这样不伦不类的,会造成程序在逻辑上的混乱。再说你举的例子也是有问题的,这么明显直接:
set aa=12345
不就行了。这个够简单吧
作者: 77七    时间: 2022-11-12 10:58

回复 3# 77七
或者参考6楼该成这样?
  1. @echo off
  2. Echo 12345 | FindStr 123 && set "a=yes" || set "a=no"
  3. echo %a%
  4. pause
复制代码

作者: smatenchen    时间: 2022-11-12 18:23

回复 3# 77七


作者: smatenchen    时间: 2022-11-12 18:29

回复 5# 77七


1,
非常感谢!


2,
我要的是Set aaa=12345,或者是Set aaa=%%a。


set "a=yes",set "a=no"
这个,不是我想要的。


3,
感谢大神的帮忙!
作者: smatenchen    时间: 2022-11-12 19:21

回复 4# qixiaobin0715 terse BAT221110 hfxiang idwma


1,
非常感谢!


2,
这个问题,其实与删除1.txt里[222]段落里各行的问题,是相连的问题。


Echo 12345,其中12345是未知的,也就是,它相当于是For里的%%a,
所以,你笑出声的set aaa=12345,是不存在的,因为完全不知道它具体会是什么。


更具体一点,它代表的是1.txt里的各行,只知道1.txt里有的行具有某些特征,
比如,它是段落名行,如[222],[???]等。


有的行具有这样的特征,第一个字符是[,比如段落名行,就具有这样的特征。


因为只知道有的行具有这样的特征,其它信息未知。
设为未知,是想让它具有通用性,而不想让它只能在特殊条件下使用。


所以,我想把1.txt里的各行通过 | 给FindStr去过滤,其结果要输出出来。
现在,问题就卡在如何把FindStr过滤后的结果输出出来。


当然,我早说过,可以借助For /F 命令把结果输出,类似 Set aaa=%%a。


FindStr过滤后的结果,我也想到了1个输出办法。
但目前我知道的输出办法,很少,太有限了,我不满意。
所以,再发帖,来求助各位大神了。


3,
请大神们出手帮忙!
非常感谢!
作者: 77七    时间: 2022-11-12 23:08

"所以,我想把1.txt里的各行通过 | 给FindStr去过滤,其结果要输出出来。
现在,问题就卡在如何把FindStr过滤后的结果输出出来。"
这放在1楼说不好吗...1楼描述都不清晰,大家怎么帮助你...看似1234点,实则大家都不知道你在说什么...

输出到文本里呢?
  1. (findstr 123 "1.txt")>>out.txt
复制代码
(发帖建议参考有偿求助区的格式发帖
需求描述:
(1)系统环境(XP/Win7/Win10/Win11,中文版/英文版,专业版/家庭版/精简版,等)
(2)想要实现的功能的具体描述
(3)测试数据及期待结果
(4)其它补充信息

作者: smatenchen    时间: 2022-11-13 00:52

本帖最后由 smatenchen 于 2022-11-13 10:14 编辑

回复 9# 77七 qixiaobin0715 terse BAT221110 hfxiang idwma
  1. (findstr 123 "1.txt")>>out.txt
复制代码



1,
非常感谢!


2,
这样的输出方式,我也想到了。


3,
我设定的场景是这样的,
  1. For /F %%a In (1.txt) Do Echo %%a| FindStr 123
复制代码


把1.txt里的每一行交给FindStr去过滤出具有123字符的那些行,
再把过滤得到的行输出出来。


过滤到x1行含有123字符,就对x1行采取a1处理方法。
过滤到x2行没有123字符,就对x2行采取a2处理方法。


这其中,就还有判断的步骤,类似If命令用法。


我的想法,大致如此,但我不知道如何用 | 把这些命令连接出来。


4,
另外,
用批处理命令,如何改变1.txt的编码格式,从ansi改为utf-8呢?


5,
请大神们帮忙!
非常感谢!
作者: 77七    时间: 2022-11-13 02:26

回复 10# smatenchen
这样不知道对不对
  1. @echo off
  2. For /F %%a In (1.txt) Do (
  3.   Echo %%a| FindStr 123 && ( echo 正在处理含123的:%%a ) || ( echo 正在处理不含123的:%%a )
  4. )
  5. pause
复制代码

作者: smatenchen    时间: 2022-11-13 09:13

本帖最后由 smatenchen 于 2022-11-13 10:15 编辑

回复 11# 77七 qixiaobin0715 terse BAT221110 hfxiang idwma

  1. @echo off
  2. For /F %%a In (1.txt) Do (
  3.   Echo %%a| FindStr 123 && ( echo 正在处理含123的:%%a ) || ( echo 正在处理不含123的:%%a )
  4. )
  5. pause
复制代码



1,
非常感谢!


2,
我的想法是,到Echo %%a| FindStr 123这一步时,把结果导出来,比如,
把它设为某个变量,以后随时都可以调用它。只是Echo %%a,是不够的。


还有,就是如何让它起判断语句的作用,用FindStr过滤后给出1个判断结果,
再据此,连接1个命令对它做处理。类似,for里的do,if后接的命令。


3,
我的想法,很奇怪,但会非常有用。


例如,删除1.txt里某段落里各行的想法,我参考了大神们的解法后,
再对代码调整,修改后,已写出了批处理命令,现在已可以实用了。


4,
请大神们帮忙!
非常感谢!
作者: 77七    时间: 2022-11-13 11:33

本帖最后由 77七 于 2022-11-13 11:42 编辑
  1. @echo off
  2. For /F %%a In (1.txt) Do (
  3.   Echo %%a| FindStr 123 && ( set "h=%%a" ) || ( set "k=%%a" )
  4. )
  5. rem h为包含 k为不包含
  6. pause
复制代码
自己加一个不就行了...
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. For /F %%a In (1.txt) Do (
  4.   Echo %%a| FindStr 123 && ( set "h=%%a" & call :al ) || ( set "k=%%a" & call :a2 )
  5. )
  6. pause
  7. :al
  8. echo al方法正在处理含123:!h!
  9. exit /b
  10. :a2
  11. echo a2方法正在处理不含123:!k!
  12. exit /b
复制代码

作者: 77七    时间: 2022-11-13 11:56

本帖最后由 77七 于 2022-11-13 12:01 编辑

"比如,
把它设为某个变量,以后随时都可以调用它。"
"随时"不知道如何理解...手动处理吗...

"还有,就是如何让它起判断语句的作用,用FindStr过滤后给出1个判断结果,
再据此,连接1个命令对它做处理。类似,for里的do,if后接的命令。"

你得具体举例,不要只描述,要提供测试数据,及期待效果。不要说的太笼统。
你重新编辑1楼吧,说详细点,找大神帮你,一次性说清楚问题。
(发帖建议参考有偿求助区的格式发帖
需求描述:
(1)系统环境(XP/Win7/Win10/Win11,中文版/英文版,专业版/家庭版/精简版,等)
(2)想要实现的功能的具体描述
(3)测试数据及期待结果
(4)其它补充信息

作者: smatenchen    时间: 2022-11-13 15:15

本帖最后由 smatenchen 于 2022-11-13 17:08 编辑

回复 13# 77七 qixiaobin0715 terse BAT221110 hfxiang idwma

1,
非常感谢!


2,
你的代码的确有用。感谢!


没想到,会这么简单。
你的提示,很有用,帮忙很大。


3,
其中,& call :al可以换成& goto :al吗?


4,
感谢大神们帮忙!


作者: smatenchen    时间: 2022-11-13 15:24

回复 14# 77七


1,
非常感谢!


2,
你的看法很好!我也想如此!
感谢!
作者: BAT221110    时间: 2022-11-13 15:29

先输出到文件,然后再
set /p XXX=<XXX.TXT

作者: smatenchen    时间: 2022-11-13 17:04

回复 17# BAT221110


1,
非常感谢!


2,
的确是,
不过这会多出1个临时文件XXX.TXT,这就不够完美了。
作者: qixiaobin0715    时间: 2022-11-16 12:19

又是findstr,又是管道,又是组合命令,恐怕效率会成问题吧。
还不如用几个判断语句就ok了,虽然感觉也不是很理想,应当能凑合使用吧:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in (1.txt) do (
  4.     set str=%%i
  5.     if "!str:~,1!"=="[" (
  6.         if "%%i"=="[222]" (
  7.             set n=true
  8.             echo,%%i
  9.         ) else (
  10.             set n=
  11.         )
  12.     )
  13.     if not defined n echo,%%i
  14. )
  15. pause
复制代码
代码未经测试。
作者: smatenchen    时间: 2022-11-16 15:18

本帖最后由 smatenchen 于 2022-11-16 15:20 编辑

回复 19# qixiaobin0715 77七 terse BAT221110 hfxiang idwma

1,
非常感谢!


2,
删除1.txt里某段落里各行的问题,我已经弄好了,现已在使用它了。


3,
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in (1.txt) do (
  4.     set str=%%i
  5.     if "!str:~,1!"=="[" (
  6.         if "%%i"=="[222]" (
  7.             set n=true
  8.             echo,%%i
  9.         ) else (
  10.             set n=
  11.         )
  12.     )
  13.     if not defined n echo,%%i
  14. )
  15. pause
复制代码


你的代码有效,可以解题,就是if套if,再接else,句子有点长。
我也是用了3个if句,但省去了else,句子稍短了一点。
解法大同小异。


3,
感谢大神们帮忙!
非常感谢!





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