中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-14 20:57
楼 主 判断奇偶数 发表于 2006-03-31 11:56 ·  中国 北京 鹏博士BGP
中级用户
★★
积分 404
发帖 179
注册 2006-03-30 14:44
UID 53056
状态 离线
呵呵 工作需要哇

我想用一个批处理来判断一个数值是奇数偶数.
这个数值是用
for /f 从一个txt文件中提取的,我的目标是如果是偶数,那么把这个数值减1,如果是奇数,把这个数值加1.
2 发表于 2006-03-31 12:15 ·  中国 福建 泉州 石狮市 电信
银牌会员
★★★
积分 1,276
发帖 469
注册 2002-12-23 13:00
UID 586
性别 男
来自 福建泉州
状态 离线
set /a _tmp1=数值/2
set /a _tmp2=2*_tmp1
if %_tmp2% equ 数值 (set /a 数值-=1) else (set /a 数值+=1)
QQ:366840202
http://chenall.net
3 发表于 2006-03-31 12:24 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
也来一个

: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%
4 发表于 2006-03-31 12:46 ·  中国 福建 泉州 电信
银牌会员
★★★
积分 1,276
发帖 469
注册 2002-12-23 13:00
UID 586
性别 男
来自 福建泉州
状态 离线
3楼的方法不错.
用%(取余)运算符.
QQ:366840202
http://chenall.net
5 发表于 2006-03-31 18:01 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
过奖了,效率还过得去吧。不过对于大于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
6 发表于 2006-03-31 18:21 ·  中国 北京 鹏博士BGP
中级用户
★★
积分 404
发帖 179
注册 2006-03-30 14:44
UID 53056
状态 离线
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的 只是学的太不精了
7 发表于 2006-03-31 18:27 ·  中国 北京 鹏博士BGP
中级用户
★★
积分 404
发帖 179
注册 2006-03-30 14:44
UID 53056
状态 离线
需要补充的就是如果这个文件是偶数文件,那就把它和比它小一数的文件拷过去
如果文件是奇数,那么把它本身和它大1的的文件也复制过去
8 发表于 2006-03-31 18:47 ·  中国 北京 鹏博士BGP
中级用户
★★
积分 404
发帖 179
注册 2006-03-30 14:44
UID 53056
状态 离线
我刚才测试 不管怎么测试 %%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 ]
9 发表于 2006-03-31 19:17 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
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 ]
10 发表于 2006-03-31 19:21 ·  中国 北京 鹏博士BGP
中级用户
★★
积分 404
发帖 179
注册 2006-03-30 14:44
UID 53056
状态 离线
呵呵 用你的可以执行
不过你这个文件里有个笔误 呵呵

flag的名称错了哦
应该是0和1
11 发表于 2006-03-31 19:27 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
唉,要好好学学willsort的态度了。
已更正。。
12 发表于 2006-03-31 19:30 ·  中国 北京 鹏博士BGP
中级用户
★★
积分 404
发帖 179
注册 2006-03-30 14:44
UID 53056
状态 离线
呵呵 说真的 小弟真想拜倒了 强悍哇~~~
另外能帮我简化或者指正一下另外一个文件吗?



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 ]
13 发表于 2006-03-31 20:21 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
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"

注意路径中的 \
你先自己修改了看看吧,然后把你修改过的贴上来让大家帮你再参考参考。
14 发表于 2006-04-01 07:35 ·  中国 北京 鹏博士BGP
中级用户
★★
积分 404
发帖 179
注册 2006-03-30 14:44
UID 53056
状态 离线
可以处理多个文加啊
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 ]
15 发表于 2006-04-01 07:43 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
早睡早起身体好,试着简单改了一下:

(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%”。
至于注册表脚本,虽然可以多选但是也有弊病,就是对文件路径中包含空格的情况需要自己在批处理中判定并处理。
论坛跳转: