分享

bat 截取字符串 (for 命令) 推荐收藏

 bubbi7 2017-01-07

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 SettingsAdministrator 桌面 test.bat
C:Documents and SettingsAdministrator 桌面 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:windowssystem32
c:windowsteett

然后在把这些代码保存为批处理, 放在桌面.
FOR /F "delims==" %%i IN (temp.txt) DO @echo    %%~$PATH:i
pause

执行后 CMD 显示如下内容
c:WINDOWS
c:WINDOWSsystem32
ECHO 处于打开状态。

为什么会这样呢, 还有一行 c:windowsteett 呢?
我们直接在 CMD 里输入 echo %path% 会显示 C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem
%%~$PATH:i 也就是在文本里寻找匹配这个 PATH 变量值的内容, 如果里面的内容和 PATH 变量相同, 就打印出来
如果不相同, 就显示一个空行!

只能适用于 PATH 变量, 其他变量不行, 如果要比较很多值, 可尝试把值赋予给 PATH 变量, 我没测试!

好了, FOR 的的变量就介绍到这了!

下面为大家分享下实例:

bat 批处理 字符串 替换函数 和 字符串截取函数

1、字符串替换 好了,符号说到这,现在说 %PATH:str1=str2% 上面语法的意思就是:将字符串变量 %PATH% 中的 str1 替换为 str2

复制代码 代码如下:

@echo off
@color 02
set ALL=demo123
echo %ALL%
set VAT=%ALL:1=aaa%
echo %VAT%
--- 结果是 demoaaa23
pause

2、字符串截取 ********************************************** 截取功能统一语法格式为:%a:~[m[,n]]% **********************************************
从第 m 为截取 n 长度的字符串, m 为偏移量(缺省为 0),n 为截取长度(缺省为全部),n 可以是负数

%a:~0,n% 相当于函数 left(a,n)   取左边 n 位 %a:~-m%   相当于函数 right (a,m) 取右边 m 位 %a:~m,n% 相当于函数 mid(a,m+1,n) 从 m+1 位开始取 n 位 %a:~m,-n% 相当于函数 mid(a,m+1,len(a)-m-n), 从 m+1 位开始,至倒数 n+1 位 %a:~m %   相当于函数 mid(a,m+1,len(a)-m) 或者 right(a,len(a)-m),从 m+1 位开始取右边全部。
%a:~[m[,n]]%
%123:~0,1%

结果 1

bat 截取字符串

复制代码 代码如下:

@echo off
set str=123456789
echo 第一个字符为:%str:~0,1%
echo 头两个字符为:%str:~0,2%
echo 头 5 个字符为:%str:~0,5%
echo 去掉最后一个字符后的字符串为:%str:~0,-1%
echo 去掉最后 3 个字符后的字符串为:%str:~0,-3%
echo 第 4 个字符为:%str:~3,1%
echo 第 4 个及其之后的 3 个字符为:%str:~3,4%
echo 最后一个字符为:%str:~-1%
echo 最后一个字符为:%str:~-1,1%
echo 最后两个字符为:%str:~-1,2%
echo 倒数第 4 个字符为:%str:~-4,1%
echo 倒数第 4 个及其之后的字符为:%str:~-4%
echo 倒数第 4 个及其之后的 1 个字符为:%str:~-4,2%
echo 倒数第 4 个及其之后的 2 个字符为:%str:~-4,3%
pause

为了说明这个问题, 我在这里把批处理取字符, 做下进一步的解释, 希望对新手有所启发
如下:
echo %var:~n,k%
我们在这里对每个参数做个说明:"%var", 即我们要从中要截取字符的字符串."~" 取字

符标志符 (我是这么理解的),"n" 我们将其理解为指针,"k" 我们将其理解为偏移地址.(注

: 指针和偏移地址都是从零开始数的)
我们还是用 namejm 版主的例子做下说明:

复制代码 代码如下:

@echo off
set str=123456789
rem 定义一个 str 字符串为 123456789
echo 第一个字符为:%str:~0,1%
rem 指针为 0, 偏移地址为 1, 即从第 0 位开始, 取 1 位
echo 头两个字符为:%str:~0,2%
rem 指针为 0, 偏移地址为 2, 即从第 0 位开始, 取 2 位
echo 头 5 个字符为:%str:~0,5%
rem  指针为 0, 偏移地址为 5, 即从第 0 位开始, 取 5 位
echo 去掉最后一个字符后的字符串为:%str:~0,-1%
rem 当 "k" 为负值时, 我们可以这样理解: 从指针开始处开始取其后面所有字符, 然后减去
后面 "abs(k) 位".. 所以这个句字我们可以做如下解释: 从第 0 位开始取其全部字符
为: 123456789 然后从后面减去 abs(k) 位, 所以最后结果为: 12345678
echo 去掉最后 3 个字符后的字符串为:%str:~0,-3%
rem  该句解释同上↑
echo 最后一个字符为:%str:~-1%
rem  参数 "n," 和 "k" 都可以为缺省, 缺省 "n," 时可以理解为: 从 abs(k) 位开始取其全部
echo 倒数第 4 个及其之后的字符为:%str:~-4%
rem        解释同上↑
echo 最后一个字符为:%str:~-1,1%
rem  n 为负值时, 表示从后面开始截取字符, 取 k 位 (此时 n 应从 1 开始数)
echo 最后一个字符为:%str:~-1,2%
rem  解释同上↑
echo 倒数第 4 个字符为:%str:~-4,1%
rem  解释同上↑
echo 倒数第 4 个及其之后的 1 个字符为:%str:~-4,2%
rem  解释同上↑
echo 倒数第 4 个及其之后的 2 个字符为:%str:~-4,3%
rem 解释同上↑
pause

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多