FOR命令中有一些变量,他们的用法许多新手朋友还不太了解,今天给大家讲解他们的用法!
先把FOR的变量全部列出来:
~I - 删除任何引号("),扩展 %I
%~fI- 将 %I 扩展到一个完全合格的路径名
%~dI- 仅将 %I 扩展到一个没逗驱动器号
%~pI- 仅将 %I 扩展到一个路径
%~nI- 仅将 %I 扩展到一个文件名
%~xI- 仅将 %I 扩展到一个文件扩展名
%~sI- 扩展的路径只含有短名
%~aI- 将 %I 扩展到文件的文件属性
%~tI- 将 %I 扩展到文件的日期/时间
%~zI- 将 %I 扩展到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩展到
空字符串
我们可以看到每行都有一个大写字母"I",这个I其实就是我们在FOR带入的变量,我们FOR语句代入的变量名是什么,这里就写什么.
比如:FOR /F %%z IN ('set') DO @echo %%z
这里我们代入的变量名是z那么我们就要把那个I改成z,例如%~fI改为%~fz
至于前面的%~p这样的内容就是语法了!
好开始讲解:
~I - 删除任何引号("),扩展 %I
这个变量的作用就如他的说明,删除引号!
我们来看腊洞这个例子:
首先我们在桌面建立一个名字为temp.txt文本文件,在里面输入这些枯局卖内容
"1111
2222"
"3333"
44"44
然后在建立个BAT文件代码如下:
FOR /F "delims=" %%i IN (temp.txt) DO @echo %%~i
pause
执行后,我们看CMD的回显如下:
1111
2222"
3333
44"44
和之前temp.txt中的内容对比一下,我们会发现第一行和第三行的引号都消失了,这就是删除引号~i的作用了!
删除引号规则如下(BAT兄补充!)
1、若字符串首尾同时存在引号,则删除首尾的引号;
2、若字符串尾不存在引号,则删除字符串首的引号;
3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除。
%~fI- 将 %I 扩展到一个完全合格的路径名
看例子:
把代码保存放在随便哪个地方,我这里就放桌面吧.
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~fi
pause
执行后显示内容如下
C:\Documents and Settings\Administrator\桌面\test.bat
C:\Documents and Settings\Administrator\桌面\test.vbs
当我把代码中的 %%~fi直接改成%%i
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%i
pause
执行后就会显示这些内容
test.bat
test.vbs
通过对比,我们很容易就看出没有路径了,这就是"将 %I 扩展到一个完全合格的路径名"的作用
也就是如果%i变量的内容是一个文件名的话,他就会把这个文件所在的绝对路径打印出来,而不只单
单打印一个文件名,自己动手动实验下就知道了!
%~dI- 仅将 %I 扩展到一个驱动器号
看例子:
代码如下,我还是放到桌面执行!
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~di
pause
执行后我CMD里显示如下
C:
C:
我桌面就两个文件test.bat,test.vbs,%%~di作用是,如果变量%%i的内容是一个文件或者目录名,他就会把他这文件
或者目录所在的盘符号打印出来!
%~pI- 仅将 %I 扩展到一个路径
这个用法和上面一样,他只打印路径不打印文件名字
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~pi
pause
我就不打结果了,大家自己复制代码看结果吧,下面几个都是这么个用法,代码给出来,大家自己看结果吧!
%~nI- 仅将 %I 扩展到一个文件名
只打印文件名字
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ni
pause
%~xI- 仅将 %I 扩展到一个文件扩展名
只打印文件的扩展名
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~xi
pause
%~sI- 扩展的路径只含有短名
打印绝对短文件名
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~si
pause
%~aI- 将 %I 扩展到文件的文件属性
打印文件的属性
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ai
pause
%~tI- 将 %I 扩展到文件的日期/时间
打印文件建立的日期
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ti
pause
%~zI- 将 %I 扩展到文件的大小
打印文件的大小
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~zi
pause
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩展到
空字符串
这是最后一个,和上面那些都不一样,我单独说说!
我们先在桌面建立一个temp.txt文件,里面写上这些内容
c:\windows
c:\windows\system32
c:\windows\teett
然后在把这些代码保存为批处理,放在桌面.
FOR /F "delims==" %%i IN (temp.txt) DO @echo %%~$PATH:i
pause
执行后CMD显示如下内容
c:\WINDOWS
c:\WINDOWS\system32
ECHO 处于打开状态。
为什么会这样呢,还有一行c:\windows\teett呢?
我们直接在CMD里输入echo %path% 会显示C:\WINDOWS\system32C:\WINDOWSC:\WINDOWS\System32\Wbem
%%~$PATH:i也就是在文本里寻找匹配这个PATH变量值的内容,如果里面的内容和PATH变量相同,就打印出来
如果不相同,就显示一个空行!
只能适用于PATH变量,其他变量不行,如果要比较很多值,可尝试把值赋予给PATH变量,我没测试!
好了,FOR的的变量就介绍到这了!
%是变量标识符。在for中代表for循环得到的结果,比如:for %i in (a b c) do @echo %i
得到的结果就是a b c。如果将以上代码写入批处理文件,则应该修改为:
for %%i in (a b c) do @echo %%i
不用问为什么是两个%,因为这是批处理的硬性规定。如果用set设置了变量那么需要调用变量时应该使用%...%将变量括起来,比如:
@echo off
set a=10
echo %a%
pause>nul
另外一个就是使用call调简脊用子进程时,%0~%9则是call的参数,至于为什么是0-9,也不用问为什么,因为call最多就是支持10个参数。比如:
@echo off
call:sub 0 1 2 3 4 5 6 7 8 9 10 11 12 13
pause>nul
:sub
echo/%1
if "%1"=="" goto :eof
shift
goto sub
以上call后面总共14个基桥参数,看来我上面的叙述不对!其实是对的,因为代码中使用了shift将参数移位,循环一次,参数向右移动一次,到13后面为空,所以跳出循环。
另拦锋渗外一个比较特殊的参数就是%0,它代表批处理本身。
要在批处理中调用exe程序并将参数传递给其他文件,可以使用以下步骤:
在批处理文件中使用start命令调用exe程序,例如:
sql
start "My Program" "C:\Program Files\MyProgram\MyProgram.exe"
这会启动名为"My Program"的窗口,并执行"C:\Program Files\MyProgram\MyProgram.exe"可执行文件。
如果要将参数传递给exe程序,可以在exe程序路径后面加上参数,例如:
sql
start "My Program" "C:\Program Files\MyProgram\MyProgram.exe" arg1 arg2 arg3
这会将三个参数arg1、arg2和arg3传递给MyProgram.exe程序。
在exe程序中,可以使用命令行参数获取批处理传递的参数。在C++中,可以使用main函数的参数来获取这些参数,例如:
c++
int main(int argc, char* argv[]){ // 获取参数个数
int argCount = argc // 获取第一个参数(即argv[0]为程序名称,argv[1]开始才是传递的参数)
char* arg1 = argv[1] // 获取第二笑哪个参数
乎升判 char* arg2 = argv[2] // 获取第三个参数
char* arg3 = argv[3] // ...}
这样就可以将批处理传递的参数在exe程序中使用了。
需要注岁改意的是,命令行参数的类型都是字符串类型,因此需要根据实际情况进行转换。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)