标题: [求助]zw19750516 进来一下, 谢了
[打印本页]
作者: quya
时间: 2008-6-3 22:28
标题: [求助]zw19750516 进来一下, 谢了
正好又一个FOR语句的用法,请帮助我如何得到准确答案。
我的批处理test1.cmd如下
@echo off
rem hhgjg>quya.txt
rem sssss>>%systemroot%\x.txt
rem dddd>>d:\test\y
for /f "tokens=2 delims=>" %%i in (test1.cmd) do echo %%i
pause
运行结果是:
quya.txt
%systemroot%\x.txt
d:\test\y
" %%i in (复件test1.cmd) do echo %%i
我希望的结果:
quya.txt
c:\x.txt (当然C也有可能是D)
d:\test\y
该怎么做? 谢谢!
作者: 26933062
时间: 2008-6-3 22:38
我来可以么
@echo off
rem hhgjg>quya.txt
rem sssss>>%systemroot%\x.txt
rem dddd>>d:\test\y
for /f "tokens=2 delims=>" %%i in ('type "%~0"^|findstr "^rem"') do echo %%i
pause
[
Last edited by 26933062 on 2008-6-3 at 10:40 PM ]
作者: bat-zw
时间: 2008-6-3 22:42
@echo off
rem hhgjg>quya.txt
rem sssss>>%systemroot%\x.txt
rem dddd>>d:\test\y
for /f "tokens=2 delims=>" %%i in ('findstr /v "in" %0') do echo %%i
pause
ps:以后求助请不要直呼其名了,这里高手多的是,我不算什么的。
[
Last edited by zw19750516 on 2008-6-3 at 10:44 PM ]
作者: quya
时间: 2008-6-3 22:48
2楼这次错误, 不能查找 REM, 因为 REM我只是暂时用一下,不想给你们造成垃圾文件在硬盘上, 实际操作的时候是其他代码。
3楼解决了最后一行垃圾,但未解决第二行变量没出来的问题。
作者: bat-zw
时间: 2008-6-3 23:03
呵呵,还真是忘记了这点,等,在想。。。
作者: bat-zw
时间: 2008-6-3 23:07
Originally posted by quya at 2008-6-3 22:48:
2楼这次错误, 不能查找 REM, 因为 REM我只是暂时用一下,不想给你们造成垃圾文件在硬盘上, 实际操作的时候是其他代码。
3楼解决了最后一行垃圾,但未解决第二行变量没出来的问题。
这次应该是没问题了:
@echo off
rem hhgjg>quya.txt
rem sssss>>%systemroot%\x.txt
rem dddd>>d:\test\y
for /f "tokens=2 delims=>" %%i in ('findstr /v "%%i" %0') do call,echo %%i
pause
[
Last edited by zw19750516 on 2008-6-3 at 11:17 PM ]
作者: quya
时间: 2008-6-3 23:24
呀, 真是奇妙!
如果能再修改一下去除垃圾的句子, 比如判断句子有很多空格(不太可能是文件名), 就更妙了。否则用一个“in”来排除,就可能误排除其他的。
do call, echo没想到,虽然能猜到一些,但希望能详细解释一下,谢谢!
睡觉了, 明天再会。
[ Last edited by quya on 2008-6-3 at 11:26 PM ]
作者: pusofalse
时间: 2008-6-3 23:28
Originally posted by zw19750516 at 2008-6-3 11:07 PM:
这次应该是没问题了:
[code]
@echo off
rem hhgjg>quya.txt
rem sssss>>%systemroot%\x.txt
rem dddd>>d:\test\y
for /f "tokens=2 delims=>" %%i in ('findstr ...
这个集合中的%%i 只是一个普通字符串吗?~
作者: HAT
时间: 2008-6-3 23:48
Originally posted by quya at 2008-6-3 11:24 PM:
呀, 真是奇妙!
如果能再修改一下去除垃圾的句子, 比如判断句子有很多空格(不太可能是文件名), 就更妙了。否则用一个“in”来排除,就可 ...
可以把for理解为一个特殊的命令行解释器,for命令在初始化的时候,已将引用变量全部扩展,也就是说%%i被替换为rem sssss>>%systemroot%\x.txt
call可以理解为for开辟的一个子进程,在这个子进程里面,系统环境变量%systemroot%再次被替换成真实的值。
作者: bat-zw
时间: 2008-6-4 00:28
Originally posted by quya at 2008-6-3 23:24:
呀, 真是奇妙!
如果能再修改一下去除垃圾的句子, 比如判断句子有很多空格(不太可能是文件名), 就更妙了。否则用一个“in”来排除,就可 ...
我也要睡觉了,这样总能判断出来而不误排除其它的吧。
@echo off
rem hhgjg>quya.txt
rem sssss>>%systemroot%\x.txt
rem dddd>>d:\test\y
for /f "tokens=2 delims=>" %%i in ('findstr /v "delims=>" %0') do call,echo %%i
pause
作者: 26933062
时间: 2008-6-4 01:23
:
其实最准确的办法是把要用for循环的内容放在文件的最后,再用for的skip来读取,就万无一失了。
作者: pusofalse
时间: 2008-6-4 01:34
最后? 不是应该最前吗?
作者: 26933062
时间: 2008-6-4 07:33
这样就绝不会有误排除了。
@echo off
for /f "tokens=2 delims=>" %%i in ('more +3 "%~0"') do call,echo %%i
pause&exit
rem hhgjg>quya.txt
rem sssss>>%systemroot%\x.txt
rem dddd>>d:\test\y
作者: cuihanjie
时间: 2008-6-4 23:33
看晕了……
作者: quya
时间: 2008-6-4 23:46
首先,请教大家一个问题,CALL 后边的“,”是什么意思? 有特别的意思吗?
其次,各位可能理解错我这个程序的本意了,这段小代码是被加密的批处理的一段, 干扰别人用 >>filename 来分析被加密的变量,当然 “for /f "tokens=2 delims=>" %%i in ('findstr /v "%%i" %0') do call,echo %%i” 这句语句本身也是考虑在被加密之列。
"ECHO %%i" 最后将被 "del %%i" 替换
所以,最重要的倒不是排除FOR语句本身,而是排除可能会生成 “del *.*” 之类的会引起无法意料的大错误,虽然这不太可能, 但能考虑到是最好的, 以防万一。这次 26933062的编程思路脱离了我的想法,当然是我没说清楚,我不好。
如果不删除别人分析的文件, 而代之于写入错误的信息, 当然最好, 但这样的编程过于复杂庞大, 可行性不大。我要做的就是用较简单的语句来造成良好的效果。
虽然批处理加密很难, 但如果同时用多种手段, 还是有所作为的。
[ Last edited by quya on 2008-6-4 at 11:48 PM ]
作者: HAT
时间: 2008-6-5 00:11
,没有什么特别的意思,它在这里是作为命令分隔符出现的,你完全可以用空格来替换它。
作者: quya
时间: 2008-6-5 00:16
Originally posted by HAT at 2008-6-5 12:11 AM:
,没有什么特别的意思,它在这里是作为命令分隔符出现的,你完全可以用空格来替换它。
谢谢!果然如此, 另外我虽然知道 CALL DIR 之类的可用,却没想到可以用在FOR里边造成这样的效果。 否则的话 echo 也好,del 也罢,那个 %systemroot% 就是不变成真实路径, 从而达不到删除那个文件的效果。