Board logo

标题: 判断奇偶数 [打印本页]

作者: kcdsw     时间: 2006-3-31 11:56    标题: 判断奇偶数

呵呵  工作需要哇  

我想用一个批处理来判断一个数值是奇数偶数.
这个数值是用
for /f 从一个txt文件中提取的,我的目标是如果是偶数,那么把这个数值减1,如果是奇数,把这个数值加1.
作者: chenall     时间: 2006-3-31 12:15
set /a _tmp1=数值/2
set /a _tmp2=2*_tmp1
if %_tmp2% equ 数值 (set /a 数值-=1)  else (set /a 数值+=1)
作者: 3742668     时间: 2006-3-31 12:24
也来一个
:number
set num=
set /a num = %1 %% 2
goto %num%

:1
set /a ret = %1 + 1
goto :eof

:0
set /a ret = %1 - 1
goto :eof
拷贝到你的批处理中,调用格式为:
call :number %数值%
echo %ret%
作者: chenall     时间: 2006-3-31 12:46
3楼的方法不错.
用%(取余)运算符.
作者: 3742668     时间: 2006-3-31 18:01
过奖了,效率还过得去吧。不过对于大于32位的数字无效,所以写了个加强版,没加纠错。
:number
set ret=
set num=
set num=%1
set tmp1=%num:~-1,1%
set /a flag = %tmp1% %% 2
goto %flag%

:1
set /a last = %num:~-1,1% + 1
set ret=%num:~0,-1%%last%
goto :eof

:0
set /a last = %num:~-1,1% - 1
set ret=%num:~0,-1%%last%
goto :eof

作者: kcdsw     时间: 2006-3-31 18:21
for /f "tokens=*" %%a in (a.txt) do (           //从a.txt中提取需要复制的文档
call :number %%a                                //执行number的奇偶判断
copy %%a.pdf f:\new
copy %a%.pdf f:\new
)
:number
set num=
set /a num = %1 %% 2                             //这里我不太明白
goto %num%

:1
set /a ret = %1 + 1
goto :eof

:0
set /a ret = %1 - 1
goto :eof

能帮我看看吗?
我需要把个别的文件挑出来复制出去,并要保证原文件夹里没有冗余
我把需要的数据放在a.txt中,用for语句提取

我的系统环境是xp sp2
大家帮我看看吧    小弟在此谢谢大家了   
我很喜欢bat的  只是学的太不精了
作者: kcdsw     时间: 2006-3-31 18:27
需要补充的就是如果这个文件是偶数文件,那就把它和比它小一数的文件拷过去
如果文件是奇数,那么把它本身和它大1的的文件也复制过去
作者: kcdsw     时间: 2006-3-31 18:47
我刚才测试  不管怎么测试  %%a取的数据不能被传递到number中
for /f "tokens=*" %%a in (a.txt) do (  
set c=%%a   
call :number %c%                              
copy %%a.pdf f:\new
)
:number
set ret=
set num=
set num=%1
echo %num%
set tmp1=%num:~-1,1%
echo %tmp1%
set /a flag = %tmp1% %% 2
echo %flag%
goto %flag%

:1
set /a last = %num:~-1,1% + 1
echo %last%
set ret=%num:~0,-1%%last%
echo %ret%
copy %ret%.pdf f:\new
goto :eof

:0
set /a last = %num:~-1,1% - 1
echo %last%
set ret=%num:~0,-1%%last%
echo %ret%
copy %ret%.pdf f:\new
goto :eof
[ Last edited by kcdsw on 2006-3-31 at 19:16 ]
作者: 3742668     时间: 2006-3-31 19:17
set /a num = %1 %% 2 这句是求余数。
%%a的数据是不会变的,要获得运算后的数字需要用%ret%。。。
根据你的要求更改如下:
for /f "tokens=*" %%a in (a.txt) do call :number %%a
exit

:number
set /a flag = %1 %% 2
goto %flag%

:1
set /a filename = %1 + 1
goto copy

:0
set /a filename = %1 - 1

:copy
copy %1.pdf f:\new\%1.pdf
copy %filename%.pdf f:\new\%filename%.pdf
goto :eof
你看看能不能执行。。记得拷贝到a.txt所在的目录下。。

[ Last edited by 3742668 on 2006-3-31 at 19:25 ]
作者: kcdsw     时间: 2006-3-31 19:21
呵呵  用你的可以执行  
不过你这个文件里有个笔误  呵呵

flag的名称错了哦
应该是0和1
作者: 3742668     时间: 2006-3-31 19:27
唉,要好好学学willsort的态度了。
已更正。。
作者: kcdsw     时间: 2006-3-31 19:30
呵呵  说真的  小弟真想拜倒了 强悍哇~~~
另外能帮我简化或者指正一下另外一个文件吗?
echo. 2>nul 3>>error.txt
For /F "tokens=1" %%a in ('date/t') do @set list=%%a
set Day=F:\print\%list%
if exist %day% goto o
Md %day%
:o
if %1#==#  goto A
copy %1 %day%
del %1 /q
rd %1
if %2#==#  goto B
shift
goto o
:A
EXPLORER %DAY%
:B
EXIT
目的:
我在桌面上建立一个指向此bat的一个快捷方式

1.不论什么时候执行,首先检测当日的文件夹是否建立
2.如果建立,检测是否有需要移动的文件,如果没有则用浏览器打开这个目录(即双击就能打开当天文件夹,以便查看有什么文件),如果有,则将该文件移动到当天的文件夹里.(我把此快捷方式放到了系统的send to文件夹中,遇到想移动的文件,直接用右键发送到)

[ Last edited by kcdsw on 2006-3-31 at 19:35 ]
作者: 3742668     时间: 2006-3-31 20:21
sorry,现在有事,提供思路:
1.获得当前日期可以用%date:~0,10%来得到,所以你的第二,三句可以合并为一句。
2.用xcopy拷贝文件不管目录是否存在都可以创建。用move移动文件就可以省略掉del命令了。
3.个人认为把这个批处理拷贝到“发送到”一次只能处理一个文件,可以考虑修改注册表。例如我以前写过一个批处理用来查看当前文件被哪个程序使用而导致无法删除,我的注册表脚本(reg文件)为:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell]

[HKEY_CLASSES_ROOT\*\shell\谁在使用它?]

[HKEY_CLASSES_ROOT\*\shell\谁在使用它?\command]
@="c:\\cxs.bat %1"

注意路径中的   \
你先自己修改了看看吧,然后把你修改过的贴上来让大家帮你再参考参考。
作者: kcdsw     时间: 2006-4-1 07:35
可以处理多个文加啊  
move的时候出过错,后来没细想 直接换成copy+del了
xcopy
For /F "tokens=1" %%a in ('date/t') do @set Day=F:\print\%%a
if not exist %day% Md %day%
:o
if %1#==#  goto A
xcopy /s /c /y %1 %day%
del /q %1
rd /s /q %1
if %2#==#  goto B
shift
goto o
:A
EXPLORER %DAY%
:B
exit
这样的话如果是把一个文件夹交给它的话  
结果文件夹本身没有复制过去,复制过去的只有它里面的文件和文件夹
怎么才能把这个原文件夹也弄过去?
或者最简单的用来分辨这个%1是文件还是文件夹?

[ Last edited by kcdsw on 2006-4-1 at 08:05 ]
作者: 3742668     时间: 2006-4-1 07:43
早睡早起身体好,试着简单改了一下:
(for %%i in (%*) do xcopy %%i f:\print\%date:~0,10%\ && del %%i) || explorer f:\print\%date:~0,10%
如果没有要复制的文件则会打开当天的目录,如果当天的目录不存在则会提示目录不存在;如果有要复制的文件就会移动文件到当天的目录中,如果当天的目录不存在则会自动创建;如果你想实现没有要拷贝的文件且当天的目录不存在时候自动建立目录的话可以考虑在explorer后面接语句“|| md f:\print\%date:~0,10%”。
至于注册表脚本,虽然可以多选但是也有弊病,就是对文件路径中包含空格的情况需要自己在批处理中判定并处理。
作者: kcdsw     时间: 2006-4-1 08:11
呵呵  我不行了  困了   觉会去  
周一继续讨教哦~~~  谢谢楼上热心的大哥们 ~~!


拜一个~~~  睡觉去了~~ 888
作者: kcdsw     时间: 2006-4-3 11:02
我用
for /f .....('date/t').... 是用来容错的
因为2000和xp不太一样的
作者: kcdsw     时间: 2006-4-3 18:13
出了新问题了

刚才测试的时候发现了一个小问题
For /f "tokens=*" %%a in (a.txt) do call :number %%a
pause

:number
set /a flag = %1 %% 2
goto %flag%

:1
set /a filename = %1 + 1
goto copy

:0
set /a filename = %1 - 1

:copy
copy %1.pdf .\need\%1.pdf && copy %filename%.pdf .\need\%filename%.pdf
goto :eof

For /f "tokens=*" %%a in (a.txt) do call :number %%a
pause

:number
set /a flag = %1 %% 2
goto %flag%

:1
set /a filename = %1 + 1
goto copy

:0
set /a filename = %1 - 1

:copy
copy %1.pdf .\need\%1.pdf
copy %filename%.pdf .\need\%filename%.pdf
goto :eof
这两个执行结果不一样

情况是这样的

a.txt里边有5 9 11
用第一段代码执行出来的是5.pdf 和6.pdf
而用第二段代码执行出来的是1.pdf  5.pdf 6.pdf
批处理所在的文件夹下有
12o.pdf
11o.pdf
7.pdf
8o.pdf
6.pdf
10o.pdf
2.pdf
3.pdf
4.pdf
1.pdf
5.pdf
9o.pdf
13.pdf

[ Last edited by kcdsw on 2006-4-3 at 18:18 ]
作者: 3742668     时间: 2006-4-4 18:08
检查一下你的a.txt后面是否有多余的回车?
也就是说要保证a.txt里面11是最后一行。
很明显,问题出在 copy %filename%.pdf .\need\%filename%.pdf 这一行上。
具体原因自己好好分析分析吧。
如果不是这个原因请再回贴说明,第一想到的就是这个原因了。
作者: kcdsw     时间: 2006-4-5 10:27
请指点  我从早上想到现在了
作者: 3742668     时间: 2006-4-5 10:42
是不是因为11后面有回车?
作者: kcdsw     时间: 2006-4-5 13:10
没有啊  

copy %filename%.pdf .\need\%filename%.pdf

这句我想了很久 也没想明白哪里有问题
作者: 3742668     时间: 2006-4-5 13:26
那你把pause语句改为exit看看。
作者: kcdsw     时间: 2006-4-5 14:24
就是因为exit不对 我才改成pause来观察它的每句的执行结果的
作者: 3742668     时间: 2006-4-5 14:43
copy %1.pdf .\need\%1.pdf && copy %filename%.pdf .\need\%filename%.pdf
表示前一句执行成功才执行后一句,而
copy %1.pdf .\need\%1.pdf
copy %filename%.pdf .\need\%filename%.pdf
不管前面一句是否成功都会执行后面一句
既然排除了你的a.txt后面没有回车问题就在这里了。
建议你在调试的时候把开头的 @echo off取消,这样可以看到结果,然后在pause后面加上一句exit,避免最后还执行一次。
另外你也可以在里面加些断点,只要在你想中断的地方加上pause.nul和echo %filename%就可以了。自己调试要比靠别人学得快。
作者: kcdsw     时间: 2006-4-6 13:33
调试完了  现在可以了  我跟踪完后发现是pause语句惹的祸
而以前我添加pause的时候是因为改了后面的一些命令

呵呵  耽误你的时间了  sorry

另外有个问题想问


if  exist %1\. goto a

这个语句我本意是用来判断%1这个路径是不是文件夹的,但是始终不成功
提示说运算符怎么怎么的
作者: 3742668     时间: 2006-4-6 18:56
害人啊,早知道让你自己去调试就完了。
所以对于你下面这个问题也决定让你自己去调试。
@echo on
echo %1
if exist %1\. echo 存在!
pause>nul
特别注意一下路径里面有空格的情况。
作者: kcdsw     时间: 2006-4-6 19:23
呵呵  那路径中有空格怎么办啊?
if exist "C:\Documents and Settings\new\桌面\新建文件夹"\.
作者: 3742668     时间: 2006-4-6 19:29
加引号。
我这边是可以执行成功的。
不过我一般都不用if,我喜欢用其他的命令来完成然后根据errorlevel来判断。
比如你说的这种情况我记得上次有这么一个贴,我的代码好象是:
dir "C:\Documents and Settings\new\桌面\新建文件夹"\. >nul 2>nul && echo ....
或者不用&&和||,在下一句用%errorlevle%以及if errorlevel来判断。
始终觉得if除了defined比较可靠以外其他的都容易惹麻烦。