标题: [文本处理] 批处理怎样实现排列组合? [打印本页]
作者: fanfande 时间: 2010-6-28 16:37 标题: 批处理怎样实现排列组合?
一个排列组合的问题,已经有初步思路:基本模型如下:
-
-
- @echo off
- set ".1=a"
- set ".2=b"
- set ".3=c"
- set n=3
- set "prefix=<title>"
- set "suffix=</title>"
- cd /d "C:\Documents and Settings\Administrator\桌面\新建文件夹"
- for /f "delims=" %%a in ('dir /a-d/b *.html') do (
- set file=%%a
- setlocal enabledelayedexpansion
- set /a n=!random!%%n+1
- (
- for %%a in (!n!) do echo;!prefix!!.%%a!!suffix!
- more "!file!"
- ) > "%temp%\~tmp"
- move "%temp%\~tmp" "!file!"
- endlocal
- )
- pause
复制代码
现在运行系列只能生成
<title>a</title>
<title>b</title>
<title>c</title>
我本意是生成这样的p33的排列组合结果里面任意取3个即可
<title>abc</title>
<title>ab</title>
<title>ac</title>
<title>bc</title>
<title>bc</title>
这样的
明白我意思了吗?
作者: batman 时间: 2010-6-28 21:22 标题: 楼主是想要这样吗?
- @echo off
- for %%a in (a b c) do (
- for %%b in (a b c) do (
- for %%c in (a b c) do (
- if %%a neq %%b if %%a neq %%c if %%b neq %%c echo %%a%%b%%c
- )
- )
- )
- pause>nul
复制代码
作者: fanfande 时间: 2010-6-30 15:12
你好,超级版主,还漏掉结果是
ab
ac
bc
这样的3个结果,
可以帮我和上面的我原始的部分结合起来吗,谢谢
作者: 523066680 时间: 2010-6-30 16:21 标题: 回复 3楼 的帖子
看你一楼的结果看晕了…… 为什么是两个bc....
组合- @echo off
- call :func "abc" ""
- pause &exit
-
- :func
- setlocal
- if %1=="" (
- if not %2=="" (echo %2)
- goto :eof
- )
- set strnow=%~1
- call :func "%strnow:~1%" "%~2%strnow:~0,1%"
- call :func "%strnow:~1%" "%~2"
- endlocal
复制代码
作者: fanfande 时间: 2010-7-4 23:29
你好,版主,不好意思我确实一开始 写错了,多了个bc,对不起哦.让大家理解错了!
我第一段的意思是
a
b
c
这样随机取a b c 放置title之间
当前需求是abc 的排列组合放置title之间
比如
<title>abc</title>
<title>ab</title>
<title>ac</title>
<title>bc</title>
麻烦帮我整合一下bat,就是把- set "prefix=<title>"
- set "suffix=</title>"
- cd /d "C:\Documents and Settings\Administrator\桌面\新建文件夹"
- for /f "delims=" %%a in ('dir /a-d/b *.html') do (
- set file=%%a
- setlocal enabledelayedexpansion
- set /a n=!random!%%n+1
- (
- for %%a in (!n!) do echo;!prefix!!.%%a!!suffix!
- more "!file!"
- ) > "%temp%\~tmp"
- move "%temp%\~tmp" "!file!"
- endlocal
- )
- pause
复制代码
结合起来,谢谢!
作者: fanfande 时间: 2010-7-4 23:31
最好生成后是替换掉原来
<title>替换前</title>
作者: fanfande 时间: 2010-7-4 23:39
哎,很多东西要学啊,都是一知半解 ,
感觉bat 和 正则表达式 都是非常 nb的东西 !
哈哈,发感慨了,期待 答案 !谢谢 ~~
作者: fanfande 时间: 2010-7-5 10:19
大伙上班了吗?繁忙的一个礼拜又开始了 ~
作者: 523066680 时间: 2010-7-5 10:59 标题: 回复 8楼 的帖子
=。= 上班ing ..偷偷折腾。- @echo off
- setlocal enabledelayedexpansion
- call :func "abc" ""
- pause &exit
-
- :func
- setlocal
- set tmpstr=%~2
- if %1=="" (
- if not %2=="" (
- if not "!tmpstr:~1!"=="" (echo ^<title^>!tmpstr!^</title^>)
- )
- goto :eof
- )
- set strnow=%~1
- call :func "%strnow:~1%" "%~2%strnow:~0,1%"
- call :func "%strnow:~1%" "%~2"
- endlocal
复制代码
作者: 523066680 时间: 2010-7-5 11:02
那个时候做组合,绕弯路的
根据楼主的情况,组合中只有一位字母的不进行显示。
- @echo off
- setlocal enabledelayedexpansion
- call :func "abc" "" 0
- pause &exit
-
- :func
- set tmpstr=%~2
- if not "!tmpstr!"=="" (
- if not "!tmpstr:~1!"=="" (echo ^<title^>!tmpstr!^<\title^>)
- )
- if %1=="" (goto :eof)
- setlocal
- set strnow=%~1
- set /a lp=0,lpb=lp+1
- :lp
- call :func "!strnow:~%lpb%!" "%~2!strnow:~%lp%,1!"
- if not "!strnow:~%lpb%!"=="" (
- set /a lp+=1,lpb=lp+1
- goto :lp
- )
- endlocal
复制代码
[ 本帖最后由 523066680 于 2010-7-5 11:05 编辑 ]
作者: 523066680 时间: 2010-7-5 11:12
按照LZ的情况,字母不多,N层for最方便,速度也快, 组合这个东西
就是每个元素存在与不存在的情况,分别组合起来的结果。
依然根据要求,中间加了判断,若结果是一个字符的就不显示了。
- @echo off
- setlocal enabledelayedexpansion
- for %%a in ("a" "") do (
- for %%b in ("b" "") do (
- for %%c in ("c" "") do (
- set str=%%~a%%~b%%~c
- if not "!str!"=="" (
- if not "!str:~1!"=="" (
- echo ^<title^>!str!^</title^>
- )
- )
- )
- )
- )
- pause
复制代码
作者: fanfande 时间: 2010-7-5 22:50
你好523
最后一段测试下来蛮不错的!
我假如用来将 指定文件夹:
C:\Documents and Settings\Administrator\桌面\新建文件夹
里面所有html 里面的<title>原有标题</title>
替换掉,如何写入呢?
即下列代码 ,指定 文件夹,指定文件格式
最好是这样的格式去定义:
set ".1=a"
set ".2=b"
set ".3=c"
set n=3
会比较方便! 谢谢 ~- cd /d "C:\Documents and Settings\Administrator\桌面\新建文件夹"
- for /f "delims=" %%a in ('dir /a-d/b *.html') do (
复制代码
谢谢523 ~
期待最全bat ~
[ 本帖最后由 fanfande 于 2010-7-5 22:55 编辑 ]
作者: 523066680 时间: 2010-7-6 09:29 标题: 回复 12楼 的帖子
我重新看了一下,目标是:
元素 存在.1 .2 .3 中 并且变量n记录了个数。
然后 获得这三个元素的所有组合,作为随机的标题
对于指定目录中的所有html文件,
给予一个随机的 <title> 对吗?
作者: fanfande 时间: 2010-7-6 12:09
是的
替换原有指定目录中所有的html文件里面的
<title>原有 </title>
523你理解的很对!
趁 ~中午饭来看下! 天气热,大家注意多喝水~
作者: 523066680 时间: 2010-7-7 13:17
主要考虑到代码结构上的不同
我没按你的 .1 .2 .3 这样固定元素
而是从开头 set element=a b c
组合的时候如果元素只有一个,会跳过。- @echo off &setlocal enabledelayedexpansion
-
- set element=a b c
-
- ::构造for语句...
- for %%x in (%element%) do (
- set "fo=for %%%%x in ("%%x" "") do (!fo!"
- set end="!end!)"
- set result=!result!%%~%%x
- )
-
- set n=0
- ::把for语句拿出来用了。中间的判断筛选需要的组合
- %fo%
- set nowstr=%result%
- if not "!nowstr!"=="" (
- if not "!nowstr:~1!"=="" (
- set /a n+=1
- set item_!n!=^<title^>!nowstr!^</title^>
- echo 筛选出的组合:!nowstr!
- )
- )
- %end:"=%
-
- ::随机获取那些组合
- cd /d "C:\Documents and Settings\Administrator\桌面\新建文件夹"
- for /f "delims=" %%a in ('dir /a-d/b *.html') do (
- set /a rand=!random!%%n+1
- for %%x in (!rand!) do (
- echo 指向的文件: %%a , 选择的标题!item_%%x!
- (
- echo !item_%%x!
- type "%%a"
- )>"%%a"
- )
- )
- pause
- exit
复制代码
哼哼!用了某个特性, 这个代码的路线基本只有批处理能走……
[ 本帖最后由 523066680 于 2010-7-7 13:23 编辑 ]
作者: fanfande 时间: 2010-7-7 16:24
我来了
请问 为啥您不用- set ".1=a"
- set ".2=b"
- set ".3=c"
- set n=3
复制代码
这样定义呢?
我运行下来出现2个bug
①当a b c 改成中文时不执行
②替换指定的文件,他将文件全部删除了,而不是单单替换的原来的<title></title> 之间的内容!
版主可以自己测试下,不甚感激啊~
作者: 523066680 时间: 2010-7-7 17:24 标题: 回复 16楼 的帖子
set ".1=a"
set ".2=b"
set ".3=c"
set n=3
我的主要是针对字符串的。 在调用函数的那句 call :func "你是谁" "" (测试中文额。。。)
如果你一定要我 .1 .2 .3 那么我必须另写一段代码, 判断n=3 然后将.1.2.3 结合起来然后
调用。这对我的代码路线来说就是一个弯路呐。
所以我决定不写这个部分了,而且楼主自己也有能力自己改上的。
文件操作部分按照你的意思,
现在我直接复制你的代码,直接在上面修改了。
组合的代码也改了,速度是慢些,不过调用一次关系不大。- @echo off
- setlocal enabledelayedexpansion
-
- set /a strn=0
- call :func "你是谁" ""
- echo 筛选出的组合个数%strn%
- ::开始文件操作
- cd /d "C:\Documents and Settings\Administrator\桌面\新建文件夹"
- for /f "delims=" %%a in ('dir /a-d/b *.html') do (
- set file=%%a
- setlocal enabledelayedexpansion
- set /a n=!random!%%strn+1
- for %%x in (!n!) do echo; !str_%%x! - %%a
- (
- for %%x in (!n!) do echo;!str_%%a!
- more "!file!"
- )> "%temp%\~tmp"
- move "%temp%\~tmp" "!file!"
- endlocal
- )
- pause &exit
-
-
- :func
- set tmpstr=%~2
- if %1=="" (
- if not %2=="" (
- if not "!tmpstr:~1!"=="" (
- set /a strn+=1
- echo 筛选的组合 !tmpstr!
- set "str_!strn!=^<title^>!tmpstr!^</title^>"
- )
- )
- goto :eof
- )
- set strnow=%~1
- call :func "%strnow:~1%" "%~2%strnow:~0,1%"
- set strnow=%~1
- call :func "%strnow:~1%" "%~2"
- goto :eof
复制代码
恩我交代一下:
set /a strn=0
call :func "元素" ""
调用 func函数, 第二参数为空。
调用之后,函数会把组合的结果 储存到 str_1 ,str_2 , str_3...这样的变量中
最后 strn会等于组合结果的个数。(显然是筛选过的,只有一个字符的组合去掉)
然后就可以自己改了吧。
[ 本帖最后由 523066680 于 2010-7-7 17:43 编辑 ]
作者: fanfande 时间: 2010-7-10 23:35
523066680 你好又要麻烦你了,前2天出差了! 事情是这样的,也许是我的描述不能让大家理解清楚:
原始状态是:
①一个文件夹里面一堆html文件,html文件有自己的<title>这里是原有的标题</title>
②需求一个bat执行,先设定几个中文标题,这里我打个比方,比如: 搜狐网 新浪网 腾讯网 中华网
③让bat随机组合这些中文标题,使之结果形如:
搜狐网新浪网
搜狐网腾讯网
搜狐网中华网
新浪网腾讯网
新浪网中华网
腾讯网中华网
.....
④将这些组合的结果替换该文件夹里面的所有html的原来的 <title>这里是需要替换的文字</title>
使得这些html的标题变成
<title>搜狐网新浪网</title>
<title>搜狐网腾讯网</title>
<title>搜狐网中华网</title>
<title>新浪网腾讯网</title>
<title>新浪网中华网</title>
<title>腾讯网中华网</title>
万分谢谢,不好意思,出差了,没来收帖子!
作者: 523066680 时间: 2010-7-11 08:59
我了个去,赶紧闪…… 我什么也不知道我什么也不知道……
哦 ,我还是说一下,你可以用 a代表 腾讯网 b代表中华网 c代表搜狐网
然后 abc排了以后,你把 a b c从字符的角度分别替换成他们对应的网,就可以了吧...
最后重申:我什么也不知道我什么也不知道……
作者: fanfande 时间: 2010-7-16 02:02
哥,帮我出个完整的吧!
我工作中经常碰到这样的事情,
按照18楼的思路,不甚感激,甚至酬谢!
作者: 523066680 时间: 2010-7-16 09:42
=。=- @echo off
- setlocal enabledelayedexpansion
-
- set /a strn=0
- set item_a=搜狐网
- set item_b=新浪网
- set item_c=腾讯网
- set item_d=中华网
-
- ::现在调用函数,组合abcd字符,一个字母的掠过
- call :func "abcd" ""
- echo 筛选出的组合个数%strn%
-
- ::开始文件操作
- cd /d "C:\Documents and Settings\Administrator\桌面\新建文件夹"
- for /f "delims=" %%a in ('dir /a-d/b *.html') do (
- set file=%%a
- setlocal enabledelayedexpansion
- set /a n=!random!%%strn+1
- for %%x in (!n!) do (echo; !str_%%x! - %%a)
- (
- for %%y in (!n!) do echo;!str_%%y!
- type "!file!"
- )> "%temp%\~tmp"
- move "%temp%\~tmp" "!file!"
- endlocal
- )
- pause &exit
-
- :func
- set tmpstr=%~2
- if %1=="" (
- if not %2=="" (
- if not "!tmpstr:~2!"=="" (
- set /a strn+=1
- set "tmpstr2="
- for %%i in (!tmpstr!) do (set tmpstr2=!tmpstr2!!item_%%i!)
- echo 筛选的组合 !tmpstr2!
- set "str_!strn!=^<title^>!tmpstr2!^</title^>"
- )
- )
- goto :eof
- )
- set strnow=%~1
- call :func "%strnow:~1%" "%~2 %strnow:~0,1%"
- set strnow=%~1
- call :func "%strnow:~1%" "%~2"
- goto :eof
复制代码
[ 本帖最后由 523066680 于 2010-7-16 09:45 编辑 ]
作者: fanfande 时间: 2010-7-22 14:31
原有的<title> <title>
仍然存在呢!
当前测试下来是"如下结果"还是有点小bug:- <title>搜狐网中华网</title>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
- <HTML xmlns="http://www.w3.org/1999/xhtml">
- <HEAD>
- <title>个人主页</title>
复制代码
原则上来讲应该将
<title>个人主页</title>全部重写为
<title>搜狐网中华网</title>
也就是说一个html里面只有一个
<title>搜狐网中华网</title>了,把之前的
<title>个人主页</title>干掉了
其实说白了就是替换原有的
<title> 这里是将要被替换掉的文字 </title> 中间的文字
其中<title> </title>不分大小写!
谢谢你小兄弟!
作者: 随风 时间: 2010-7-22 15:46
不懂 html 文件,请问里面会有多个 <title>标题</title> 需要替换吗?
还有,你先设定几个中文标题,到底是多少个标题可以确定吗?
还有,是所有html文件都替换为统一标题,还是每个html文件随机替换为某个标题?
[ 本帖最后由 随风 于 2010-7-22 15:48 编辑 ]
作者: fanfande 时间: 2010-7-23 11:54
回复随风 版主的几个问题:
①每个html文件只有一个<title>这里显示成标题</title>
②不是预先设置中文标题,当然也可以预先设置好标题,这里是随机已经设定的几个标题然后让他去替换原有的html里面的
<title>这里显示成标题</title>
至于多少个标题,完全对应于有几个html文件!
③最终结果不是每个html文件都统一标题,那就没有意义了,而是让每个html文件用随机产生的标题去替换,最终的目的就是尽可能的让每个html文件的标题不一样 ,谢谢 版主关心!
这2个问题也帮我处理下,不甚感激!
http://www.bathome.net/thread-8470-1-1.html
http://www.bathome.net/thread-8469-1-1.html
作者: fanfande 时间: 2010-7-26 08:23
版主帮忙看一下,谢谢!
作者: fanfande 时间: 2010-7-27 23:05
请问, 帮主不在吗?
作者: fanfande 时间: 2010-7-27 23:05
请问, 帮主不在吗?
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |