中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 我发现CMD里的每行字符限制数
作者:
标题: 我发现CMD里的每行字符限制数 上一主题 | 下一主题
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『楼 主』:  我发现CMD里的每行字符限制数

我在执行下面的BAT文件时正常
@echo off
setlocal ENABLEDELAYEDEXPANSION
set a=22
for /l %%c in (1,1,1019) do set a=!a!22
call :a !a!
goto :eof
:a
set gs=
set c=%1
:b
set d=%c:~-2%
set c=%c:~0,-2%
if %d%*==22* set/a gs+=2&goto b
echo !gs!
goto :eof
而在执行下面的BAT文件就显示输入行太长。
@echo off
setlocal ENABLEDELAYEDEXPANSION
set a=22
for /l %%c in (1,1,1020) do set a=!a!22
call :a !a!
goto :eof
:a
set gs=
set c=%1
:b
set d=%c:~-2%
set c=%c:~0,-2%
if %d%*==22* set/a gs+=2&goto b
echo !gs!
goto :eof
也就是输入行最长是2048个字!
随便说下,在CMD里执行 SET /A 39%16会得到39除16的余数7,而在BAT文件里执行 SET /A 39%16会得到396,因为在BAT文件里系统启用了默认的%0~~%9 而%1是空的话执行 SET /A 39%16就会得到396,如果要在BAT里取余应该用下面类似的命令来取余:
SET A=16
SET/A 39%%A%
在执行时系统会把%A%替换成16后执行取余操作!



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-10-17 21:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 2 楼』:  

qwe1234567 兄使用的是 2000 吧?
命令行长度限制:

  Quote:
Long Commands
Under Windows NT, the command line is limited to 256 characters.
Under Windows 2000, the command line is limited to 2046 characters.
Under Windows XP, the command line is limited to 8190 characters.

For all OS's NTFS and FAT allows pathnames of up to 260 characters.

参考链接:http://www.ss64.com/nt/cmd.html

在批处理中需要将单百分号替换为双百分号
set /a x=39%%16



  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-10-17 22:20
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 3 楼』:  

xp下也有限制...

2006-10-17 22:35
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
9527
银牌会员

努力做坏人


积分 1185
发帖 438
注册 2006-8-28
来自 北京
状态 离线
『第 4 楼』:  

set  a=16
set /a d=39%%16
SET /a b=39%%a
set /a c=a+1
echo %c%   %b%   %d%

qwe1234567兄试试上面的代码吧,也许就会明白,SET /A有一个特性,那就是,
例如 : set a=1  那么 set /a a=a+1和set /a %a%+1是一样的



我今后在论坛的目标就是做个超级坏人!!!
2006-10-17 22:54
查看资料  发短消息 网志  OICQ (329429)  编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 5 楼』:  

有意思, qwe1234567版主第一楼取余数时忘记了cmd和批处理下"%"与"%%"号的差别.

输入行太长, 这可能是因为系统为环境变量分配的内存空间是有限的, 发现XP下为八千多个字节, 2000下是二千多字节, 还是有区别的.

而pip兄讲的那个set /a的特性, set /a a=a+1, set /a a=%a%+1实际是一样的, 也是set命令的一种处理机制吧.

%a%作为一个环境变量, 一般要用%a%来表示. 而跟在set /a 后不用转义, 也就是说出现字母a, 系统自动将其当作一个字符变量来处理, 然后在内存中跟据变量名获取相应的字符串值.

[ Last edited by pengfei on 2006-10-17 at 23:42 ]

2006-10-17 23:11
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 6 楼』:  

的确有限制。上次在一个快捷方式inject脚本就发现了这个问题。很是郁闷




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-10-17 23:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 7 楼』:  

恩,有限制...
 
  记得上次执行N个"echo %time%"的批处理时,提示说命令行太长...

  汗一个...


2006-10-18 01:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 8 楼』:  

xp  没有这个限制的~pip说的对,我试过的昨天刚刚

2006-10-18 05:41
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by he200377 at 2006-10-18 05:41:
xp  没有这个限制的~pip说的对,我试过的昨天刚刚


  XP没有命令字符长度的限制吗?不会吧?我的怎么限制了?


2006-10-18 06:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 10 楼』:  

变量的存储单元总是有大小限制的. 只是多少的问题.

2006-10-18 08:42
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: