Board logo

标题: 关于set命令的几点疑惑(已解决) [打印本页]

作者: hangyug     时间: 2007-1-21 00:38    标题: 关于set命令的几点疑惑(已解决)

学习批处理,学到了set命令,一头雾水,在论坛里搜索了一下,是有一些set方面的,但是看了之后还是不太懂,自带的帮助也看了,感觉还是不太懂。哪位有好一点的set的教程啊?发个连接也可以,先谢过了。

[ Last edited by namejm on 2007-1-20 at 08:07 PM ]
作者: ccwan     时间: 2007-1-21 00:43
哪里不懂提出来啊。总有人能解答的吧?
作者: timlee     时间: 2007-1-21 00:48
说出来我们也好学习学习.
作者: hangyug     时间: 2007-1-21 01:16
问题都很菜,希望大家有点耐心。。。呵。。
问题一:
set a=
set/p a=请输入关键字……  
start http://www.baidu.com/s?wd=%a%
自带的帮助是这样写的:SET /P variable=[promptString]
那第一句等号右边怎么什么都没有?那到底把什么指派给变量a了?
还有这么一句:”set命令不容许变量含有等号“怎么理解?
问题二:
看到这样一个帖子:
set "STARTPRGNAME=%STARTPRGNAME:"=%"
语句中:"=%"表示什么意思?

if /i "%STARTPRGNAME%" == "cmd" goto :cmd_exe
语句中/i表示什么意思?

if not "%STARTPRGNAME:.bat=%" == "%STARTPRGNAME%" goto :cmd_or_bat
语句中:.bat表示什么意思?

第一句中:set后面的语句为何用引号括起来?代表什么?还有,等号右边的
%STARTPRGNAME的意思是把什么指派给等号左边的STARTPRGNAME了?
第二句中:"%STARTPRGNAME%"是怎么回事?它和%%1有什么区别?
作者: 0401     时间: 2007-1-21 03:13
HoHo~我比较适合回答这种基础题目

关于问题一你自己动手试试就知道了。
第一句[set a=]本意就是想将变量a置空,所以等号右边当然什么都没有了。其实就是删除变量a拉。
第二句的[/p]表示读取用户的输入,并且赋值给变量a。[请输入关键字…… ]这句话是提示给用户看的。也就是说你执行[set/p a=请输入关键字……  ]后,屏幕显示[请输入关键字……  ],然后你输入[keyword]并且回车后变量a的值就是[keyword]了。你增加一句[echo %a%]就了解了。
关于[set命令不容许变量含有等号]这句好理解,像上面的a就是变量名,你说你能设置一个变量名为[a=]的吗?

问题二:
你仔细查看[set]的帮助会看到这么句[%PATH:str1=str2%],意思是将变量[path]中的所有字符或字符串[str1]换成[str2],帮助中还说["str2" 可以是空的。]。举个例子,变量[a]值为[0401]执行[set c=%a:0=%]后,变量[c]的值为[41]。
于是这句[set "STARTPRGNAME=%STARTPRGNAME:"=%"]就可以理解为删除变量[STARTPRGNAME]中的所有引号并将处理后的值仍赋给[STARTPRGNAME]。有引号是因为它要处理的字符是个["]。

继续。。。
[if]中的[/ i]表示不区分大小写。这个好理解,楼主你也太懒了。
再接下来的这句跟上面的变量替换一个意思,再举个例子,假设变量[STARTPRGNAME]值为[hehe.bat],那么[%STARTPRGNAME:.bat=%]==[hehe],意思可能是这样(我猜的):如果是.bat文件则跳到这里[:cmd_or_bat]。

回答最后一行。
[%STARTPRGNAME%]就是扩展变量[STARTPRGNAME]的值,其实就是读取变量了。[%%1]只是用来表示[%1],因为在批处理中双写[%]才能得到一个[%],而[%1]意思是该批处理文件的第一个参数。你试试新建一个批处理,比如[tt.bat],文件内容只有一行[@echo %1 是第一个参数],然后用命令行调用看看 [tt.bat hehe]。

打字好累~~

[ Last edited by 0401 on 2007-1-21 at 03:18 AM ]
作者: hangyug     时间: 2007-1-21 04:46
谢谢楼上的耐心回答,辛苦你了。。。问题一我懂了,不过,你可能没看明白我的问题二是什么。
我再说一遍吧。
set "STARTPRGNAME=%STARTPRGNAME:"=%"
语句中:"=%"表示什么意思?

if /i "%STARTPRGNAME%" == "cmd" goto :cmd_exe
语句中/i表示什么意思?

if not "%STARTPRGNAME:.bat=%" == "%STARTPRGNAME%" goto :cmd_or_bat
语句中:.bat表示什么意思?
以上这些都是我看到的一个帖子的内容,其中的问题是写这个帖子的人问的,而我的问题在下面:
第一句中:set后面的语句为何用引号括起来?代表什么?还有,等号右边的
%STARTPRGNAME的意思是把什么指派给等号左边的STARTPRGNAME了?
第二句中:"%STARTPRGNAME%"是怎么回事?
尤其是:它("%STARTPRGNAME%")和%%1有什么区别?学习if时没见有
"%STARTPRGNAME%"形式的参数啊???

[ Last edited by hangyug on 2007-1-20 at 03:50 PM ]
作者: tao0610     时间: 2007-1-21 05:19
两大秘笈:

1.善用搜索

2.多看帮助信息

.....
作者: 0401     时间: 2007-1-21 06:25
to 楼主:

我在回答中就看明白你的问题二了,只是你没看懂我的回答。
那我也再说一遍吧。
说之前我想告诉你,如果你可以自己动手试的话,我想你已经知道为什么了。
我之前的回答希望你能再认真看下,我只是再这里再举个例子。
@echo off
set STARTPRGNAME=wInG
echo %%STARTPRGNAME%% 变量值为 %STARTPRGNAME%
set STARTPRGNAME=%STARTPRGNAME:G=gzero%
echo %%STARTPRGNAME%% 变量经过字符替换后为 %STARTPRGNAME%
if %STARTPRGNAME%==wingzero echo 看看这句有没有输出
if /i %STARTPRGNAME%==wingzero echo 这句呢?输出了吧。
pause>nul
不玩了,楼主多看几遍上面的解答吧,我已经很难再表达更低的意思了。

BTW:感谢 redtek  为我打的字加分,呵呵。

[ Last edited by 0401 on 2007-1-21 at 06:30 AM ]
作者: hangyug     时间: 2007-1-21 08:04
谢谢0401兄,原来你把我的问题和我所引用帖子中的提问都给回答了,再次感谢你的回复。。。
作者: kafen     时间: 2007-1-21 09:00
我也要感谢这么热心且耐心的朋友!
作者: shorterz     时间: 2007-1-23 11:36
有学了不少,呵呵,继续。。。
作者: g4rr     时间: 2007-1-24 05:28
建议多看几个实例就会觉得很容易明白了.

还得注意现在的选择命令跟以前老DOS的不同.
作者: sjjhhx     时间: 2007-2-8 09:55
讲得很细,这样我们菜鸟才能明白,谢谢0401兄的耐心和细心!
作者: anqing     时间: 2007-2-8 11:18
关于set的解释,5楼讲得很详细,也有例子。
好看一些
作者: juventusryp     时间: 2007-2-14 06:09
5楼的讲的很明白啊,我们菜鸟一看就明白
作者: netchxing     时间: 2007-2-14 09:05
5楼的讲的很明白啊,我们菜鸟一看就明白
作者: hxmupdata     时间: 2007-3-13 02:22
问的好,答的更好。加分加的好 ,学了不少了。。。。
作者: jackyggt     时间: 2007-3-13 08:21
灌水
作者: Billunique     时间: 2007-3-21 07:23
关于扩展名的判断很受学习 多谢前辈!
作者: fd2000     时间: 2007-4-2 08:27


  Quote:
Originally posted by 0401 at 2007-1-20 02:13 PM:
HoHo~我比较适合回答这种基础题目

关于问题一你自己动手试试就知道了。
第一句[set a=]本意就是想将变量a置空,所以等号右边当然什么都没有了。 ...

0401是个不错的老师,很有耐心,值得我们学习,就是有的学生上课不仔细听。呵呵。
作者: myth126     时间: 2007-4-2 10:11
下面这段代码怎么理解呀?好多特殊符号的用法,请叫各位了!先行谢过!
setlocal enabledelayedexpansion
for %%i in ("%tmp%\encrypt.tmp") do (
echo %%~zi >nul 2>nul
set size=%%~zi
set num=!size:~-1!
set /a mod=!num!%%2
if !mod! equ 0 (goto even) else (goto odd)
)
作者: jz1043     时间: 2007-4-9 05:41
我也学到东西了,谢谢讲解
作者: fyb198351     时间: 2007-4-17 07:31
学了不少的东西~~~~
作者: Vampire     时间: 2007-4-18 07:48


  Quote:
Originally posted by myth126 at 2007-4-1 09:11 PM:
下面这段代码怎么理解呀?好多特殊符号的用法,请叫各位了!先行谢过!
setlocal enabledelayedexpansion
for %%i in ("%tmp%\encrypt.tmp") do (
echo %%~zi >nul 2&g ...

希望高手回答下,我也有些不懂,大概第三行echo %%~zi >nul 2>nul不晓得啥意思。
作者: mtiankong     时间: 2007-4-18 09:37


  Quote:
Originally posted by Vampire at 2007-4-17 06:48 PM:

希望高手回答下,我也有些不懂,大概第三行echo %%~zi >nul 2>nul不晓得啥意思。

大概意思就是不显示%i的文件大小,出现错误也不显示。
作者: qiwei201     时间: 2007-4-20 00:14
学习了,我又学到一些东西
作者: htysm     时间: 2007-4-20 00:55
将变量%%i扩展到文件的大小。for /?中有说明:

带有修改程序的变量 说明
%~I 展开删除任何前后引号 ("") 的 %I。
%~fI 将 %I 展开到完全合格的路径名。
%~dI 只将 %I 展开到驱动器号。
%~pI 只将 %I 展开到路径。
%~nI 只将 %I 展开到文件名。
%~xI 只将 %I 展开到文件扩展名。
%~sI 展开路径以只包含短名称。
%~aI 将 %I 展开到文件的文件属性。
%~tI 将 %I 展开到文件的日期和时间。
%~zI 将 %I 展开到文件大小。
%~$PATH:I 搜索 PATH 环境变量所列出的目录,并将 %I 展开到第一个找到的完全合格的名称。如果没有定义环境变量名称,或搜索没有找到文件,则此修改程序扩展成空字符串。

下表列出可用来获得综合结果的修改程序组合。

变量(使用组合的修改程序) 说明
%~dpI 只将 %I 展开到驱动器号和路径。
%~nxI 只将 %I 展开到文件名和扩展名。
%~fsI 将 %I 展开到只包含短名称的完整路径名。
%~dp$PATH:I 在 PATH 环境变量中所列出的目录中搜索 %I,并展开到第一个找到结果的驱动器号和路径。
%~ftzaI 将 %I 展开到输出行(如 dir一样)。
作者: ccuu668     时间: 2007-5-2 16:01
比较适合我们这些新手.不过说实话有的地方我都还看不懂到底是什么意思.唉!只有自己慢慢来了.
再次我也特别感谢一楼的GG,你真的是一比较热心的网友.精神值得我们去学习.
作者: yunsenjhl     时间: 2007-7-10 22:19
5分钟以前刚刚有些理解set的用途
作者: 6622186     时间: 2007-7-11 17:42
只有把 set 命令弄懂了, 才能写出好的东西.
作者: bbq5201     时间: 2007-8-9 23:49
学到不少东西哦..
真感谢
作者: flamemperor     时间: 2007-9-10 11:43


  Quote:
Originally posted by 0401 at 2007-1-21 03:13 AM:
问题二:
你仔细查看[set]的帮助会看到这么句[%PATH:str1=str2%],意思是将变量[path]中的所有字符或字符串[str1]换成[str2],帮助中还说["str2" 可以是空的。]。举个例子,变量[a]值为[0401]执行[set c=%a:0=%]后,变量[c]的值为[41]。
于是这句[set "STARTPRGNAME=%STARTPRGNAME:"=%"]就可以理解为删除变量[STARTPRGNAME]中的所有引号并将处理后的值仍赋给[STARTPRGNAME]。有引号是因为它要处理的字符是个["]。

请问,[%PATH:str1=str2%]中的这个str1允许是变量么?
作者: flamemperor     时间: 2007-9-10 14:01
set var1=abc
set var2=bc
set var=%var1:var2=%
@echo %var%

这样写好像var的值并不是a。
作者: Li103Z     时间: 2007-11-18 08:56
讲得详细,菜鸟明白
作者: rodane     时间: 2007-11-28 15:29
5楼回答的很详细
作者: gamefjq     时间: 2007-11-29 11:58    标题: xiexie

详细
作者: regvip2008     时间: 2008-1-15 16:45
确实是讲得非常的仔细!让人一目了然!
作者: zyz0304360     时间: 2008-1-15 17:00
0401
菜鸟的好朋友
作者: zyz0304360     时间: 2008-1-15 17:00

作者: TBAGE     时间: 2008-1-15 20:11
关注`学习中...
作者: pkwwda     时间: 2008-1-16 13:08    标题: 谢谢

学习了
作者: 313885174     时间: 2008-1-16 13:21
原来是这样.
作者: SamuelFish     时间: 2008-1-22 18:09
5楼的说得清楚些,谢了
作者: lokeymei     时间: 2008-11-8 13:01    标题: 学习中

对于我有很大的帮助,,,谢谢
作者: oathever     时间: 2008-12-7 17:17    标题: 不错哈....

0401 这位兄弟倒是热心...
   不错哈. . 学到了不少东西...  
其实我也是初学者.,.
   呵呵,,,   多多看看贴子!!!