中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-01 00:29
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 我发现CMD里的每行字符限制数 查看 3,039 回复 9
楼 主 我发现CMD里的每行字符限制数 发表于 2006-10-17 21:30 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
20年会员
UID 42843
性别 男
来自 四川南充
状态 离线
我在执行下面的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后执行取余操作!
2 发表于 2006-10-17 22:20 ·  中国 北京 中移铁通
荣誉版主
★★★
积分 1,338
发帖 356
注册 2005-07-15 12:09
21年会员
UID 40733
性别 男
状态 离线
qwe1234567 兄使用的是 2000 吧?
命令行长度限制:


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

3 发表于 2006-10-17 22:35 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
20年会员
UID 58987
来自 湖南.娄底
状态 离线
xp下也有限制...
4 发表于 2006-10-17 22:54 ·  中国 北京 联通
银牌会员
★★★
努力做坏人
积分 1,185
发帖 438
注册 2006-08-28 12:00
19年会员
UID 61449
来自 北京
状态 离线
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是一样的
我今后在论坛的目标就是做个超级坏人!!!
5 发表于 2006-10-17 23:11 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
20年会员
UID 58987
来自 湖南.娄底
状态 离线
有意思, 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 ]
6 发表于 2006-10-17 23:46 ·  中国 山东 泰安 教育网
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
20年会员
UID 42173
性别 男
状态 离线
的确有限制。上次在一个快捷方式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'>"
7 发表于 2006-10-18 01:35 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
恩,有限制...
 
  记得上次执行N个"echo %time%"的批处理时,提示说命令行太长...

  汗一个...
8 发表于 2006-10-18 05:41 ·  中国 甘肃 平凉 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
xp 没有这个限制的~pip说的对,我试过的昨天刚刚
9 发表于 2006-10-18 06:11 ·  中国 上海 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
Originally posted by he200377 at 2006-10-18 05:41:
xp 没有这个限制的~pip说的对,我试过的昨天刚刚


  XP没有命令字符长度的限制吗?不会吧?我的怎么限制了?
10 发表于 2006-10-18 08:42 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
20年会员
UID 58987
来自 湖南.娄底
状态 离线
变量的存储单元总是有大小限制的. 只是多少的问题.
论坛跳转: