中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-17 03:22
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » CALL 和 SET 的問題 查看 1,525 回复 12
楼 主 CALL 和 SET 的問題 发表于 2008-02-01 17:46 ·  中国 香港 环球全域电讯国际互联节点
初级用户
积分 22
发帖 7
注册 2008-01-20 17:59
UID 109103
性别 男
状态 离线
set str1=abcdefghijklmnopqrstuvwxyz
set str2=ABCDEFGHIJKLMNOPQRSTUVWXYZ

:main
cls
set str=
set /p str= 請輸入字符串(退出請直接按回車):
if not defined str exit
cls
echo.
echo 轉換前:"%str%"
echo.
for /l %%i in (0,1,25) do (
call set char1=%%str1:~%%i,1%%
call set char2=%%str2:~%%i,1%%

call :change
)
echo ____________________________________________
echo.
echo 轉換後:"%str%"
echo.
echo 按任意鍵進行下一次演示...
pause>nul
goto main

:change
call set "str=%%str:%char1%=%char2%%%"
goto :eof


想問問Call Set xxxx 有什麼作用呢?
2 发表于 2008-02-01 17:56 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
貌似和启用延时变量的效果一样

就是让FOR循环中的SET在内部的改变有效。
3 发表于 2008-02-01 18:14 ·  中国 香港 环球全域电讯国际互联节点
初级用户
积分 22
发帖 7
注册 2008-01-20 17:59
UID 109103
性别 男
状态 离线
Originally posted by slore at 2008-2-1 05:56 PM:
貌似和启用延时变量的效果一样

就是让FOR循环中的SET在内部的改变有效。

多謝你的回答,但如果用setlocal enabledelayedexpansion能做到和上面的效果嗎?
4 发表于 2008-02-01 18:16 ·  中国 香港 环球全域电讯国际互联节点
初级用户
积分 22
发帖 7
注册 2008-01-20 17:59
UID 109103
性别 男
状态 离线
Set C1=!!str1:~%%a,1!!
Set C2=!!str2:~%%a,1!!

已經試過ok了,
5 发表于 2008-02-12 19:06 ·  中国 吉林 吉林市 联通
中级用户
★★
积分 307
发帖 130
注册 2008-02-01 21:29
UID 109981
性别 男
状态 离线
call set char1=%%str1:~%%i,1%%
一句实际上把set语句执行了两遍:
第一遍set char1=%str1:~0,1%
第二遍set char1=a
6 发表于 2008-05-06 19:10 ·  中国 上海 上海地面通信息网络有限公司
中级用户
★★
积分 240
发帖 115
注册 2008-03-10 19:31
UID 112561
性别 男
状态 离线
call set "str=%%str:%char1%=%char2%%%"
谁能详细解释一下这句啊。不胜感激...
7 运行以下代码你就明白了: 发表于 2008-05-06 19:24 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
UID 112398
性别 男
状态 离线

@echo off
set a=123456789
echo a=%a%
set b=%a:~,4%&set c=%a:~5,4%
echo b=%b% c=%c%
echo call,set a=%%a:%b%=%c%%%
call,set a=%%a:%b%=%c%%%
echo a=%a%
pause>nul
批处理之家新域名:www.bathome.net
8 发表于 2008-05-06 20:16 ·  中国 上海 电信
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
UID 103929
性别 男
来自 广西
状态 离线
Originally posted by terrytong at 2008-5-6 19:10:
call set "str=%%str:%char1%=%char2%%%"
谁能详细解释一下这句啊。不胜感激...

我是在别的地方看到的,现在奉献出来:)
使用call进行变量延迟遵循以下两个步骤的替换,有n个call,就进行n+1次替换
1.如果分号的数量为单(只看一边),则把最里面的分号用变量替换
2.把双数的分号去掉一半(只看一边)

call set "str=%%str:%char1%=%char2%%%"
比如输入的是"a",转换过程如下(有1个call,则进行2次替换,每次有两个步骤):
1.(1)把单个分号的用变量替换,得
"str=%%str:a=A%%"
(2)把双数的分号去掉一半,得
"str=%str:a=A%"
2.(1)把单个分号的用变量替换,得
"str=A"
(2)把双数的分号去掉一半,由于没有分号了,故为A

其实在本例中,可以不用call :change的,用下面一句代替也完全可以达到同样效果:
call call set str=%%%%str:%%char1%%=%%char2%%%%%%

举个例子加深印象:

@echo off
set "a=cn-dos"
set "b=a"
set "c=b"
set "d=c"
echo %a%
call echo %%%b%%%
call call echo %%%%%%%c%%%%%%%
call call call echo %%%%%%%%%%%%%%%d%%%%%%%%%%%%%%%
pause
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
ngd +2 2008-05-14 21:07
9 发表于 2008-05-06 20:22 ·  中国 重庆 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
UID 89899
性别 男
状态 离线
willsort 兄对逃逸字符的讲解也许对楼主有帮助。
10 发表于 2008-05-06 23:16 ·  中国 广西 南宁 电信
中级用户
★★
丶杏灬丶
积分 280
发帖 105
注册 2008-05-06 03:37
UID 117858
性别 男
来自 广西
状态 离线
call,set..这些我不太明白哪里有参考资料?可否贡献一下
11 发表于 2008-05-07 15:16 ·  中国 上海 上海地面通信息网络有限公司
中级用户
★★
积分 240
发帖 115
注册 2008-03-10 19:31
UID 112561
性别 男
状态 离线
Originally posted by moniuming at 2008-5-6 20:16:

我是在别的地方看到的,现在奉献出来:)
使用call进行变量延迟遵循以下两个步骤的替换,有n个call,就进行n+1次替换
1.如果分号的数量为单(只看一边),则 ...

你举的例子我能看的懂,但是
"str=%str:a=A%"
把单个分号的用变量替换,怎么得到
"str=A" ?

应该是"str=a:a=A 啊。
不好意思。见笑了。
12 发表于 2008-05-07 17:36 ·  中国 广西 中移铁通
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
UID 103929
性别 男
来自 广西
状态 离线
环境变量替换已如下增强:

%PATH:str1=str2%

会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
13 发表于 2008-05-21 09:19 ·  中国 上海 电信
初级用户
★★
积分 160
发帖 81
注册 2006-07-27 17:52
UID 59377
性别 男
状态 离线
那位有这方面的资料,能否共享一下,让小弟系统的学习一下
十分感谢
论坛跳转: