|
qoozen
初级用户
积分 22
发帖 7
注册 2008-1-20
状态 离线
|
『楼 主』:
CALL 和 SET 的問題
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 有什麼作用呢?
|
|
2008-2-1 17:46 |
|
|
slore
铂金会员
积分 5212
发帖 2478
注册 2007-2-8
状态 离线
|
『第
2 楼』:
貌似和启用延时变量的效果一样
就是让FOR循环中的SET在内部的改变有效。
|
|
2008-2-1 17:56 |
|
|
qoozen
初级用户
积分 22
发帖 7
注册 2008-1-20
状态 离线
|
『第
3 楼』:
Quote: | Originally posted by slore at 2008-2-1 05:56 PM:
貌似和启用延时变量的效果一样
就是让FOR循环中的SET在内部的改变有效。 |
|
多謝你的回答,但如果用setlocal enabledelayedexpansion能做到和上面的效果嗎?
|
|
2008-2-1 18:14 |
|
|
qoozen
初级用户
积分 22
发帖 7
注册 2008-1-20
状态 离线
|
『第
4 楼』:
Set C1=!!str1:~%%a,1!!
Set C2=!!str2:~%%a,1!!
已經試過ok了,
|
|
2008-2-1 18:16 |
|
|
pinghu
中级用户
积分 307
发帖 130
注册 2008-2-1
状态 离线
|
『第
5 楼』:
call set char1=%%str1:~%%i,1%%
一句实际上把set语句执行了两遍:
第一遍set char1=%str1:~0,1%
第二遍set char1=a
|
|
2008-2-12 19:06 |
|
|
terrytong
中级用户
积分 240
发帖 115
注册 2008-3-10
状态 离线
|
『第
6 楼』:
call set "str=%%str:%char1%=%char2%%%"
谁能详细解释一下这句啊。不胜感激...
|
|
2008-5-6 19:10 |
|
|
bat-zw
金牌会员
永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『第
7 楼』:
运行以下代码你就明白了:
@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 |
|
2008-5-6 19:24 |
|
|
moniuming
银牌会员
永远的菜鸟
积分 1335
发帖 574
注册 2007-11-27 来自 广西
状态 离线
|
『第
8 楼』:
Quote: | 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
此帖被 +2 点积分 点击查看详情 评分人:【 ngd 】 | 分数: +2 | 时间:2008-5-14 21:07 |
|
|
|
2008-5-6 20:16 |
|
|
HAT
版主
积分 9023
发帖 5017
注册 2007-5-31
状态 离线
|
『第
9 楼』:
willsort 兄对逃逸字符的讲解也许对楼主有帮助。
|
|
2008-5-6 20:22 |
|
|
joyn
中级用户
丶杏灬丶
积分 280
发帖 105
注册 2008-5-6 来自 广西
状态 离线
|
『第
10 楼』:
call,set..这些我不太明白哪里有参考资料?可否贡献一下
|
|
2008-5-6 23:16 |
|
|
terrytong
中级用户
积分 240
发帖 115
注册 2008-3-10
状态 离线
|
『第
11 楼』:
Quote: | 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 啊。
不好意思。见笑了。
|
|
2008-5-7 15:16 |
|
|
moniuming
银牌会员
永远的菜鸟
积分 1335
发帖 574
注册 2007-11-27 来自 广西
状态 离线
|
『第
12 楼』:
环境变量替换已如下增强:
%PATH:str1=str2%
会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
|
|
2008-5-7 17:36 |
|
|
jia332
初级用户
积分 160
发帖 81
注册 2006-7-27
状态 离线
|
『第
13 楼』:
那位有这方面的资料,能否共享一下,让小弟系统的学习一下
十分感谢
|
|
2008-5-21 09:19 |
|