Board logo

标题: [文本处理] 【已解决】批处理如何截取通过For语句赋值的变量的值的最后一个字符? [打印本页]

作者: hbb    时间: 2014-6-14 17:43     标题: 【已解决】批处理如何截取通过For语句赋值的变量的值的最后一个字符?

本帖最后由 pcl_test 于 2016-7-3 19:31 编辑

请教以下代码的最后一段“ echo %%a:~-1%”请问执行后为什么不能得到最后一个字符,请问应该如何修改,谢谢!
  1. for /f "tokens=* delims=[2]-" %%a in ('wmic DISKDRIVE get signature ^| find /v /n "" ^| find "[2]"') do echo %%a & echo %%a:~-1%
  2. pause
复制代码

作者: apang    时间: 2014-6-14 20:27

  1. for /f %%a in ('wmic DISKDRIVE get signature ^| findstr [0-9]') do (
  2.     set "var=%%a"
  3. )
  4. echo,%var%
  5. echo,%var:~-1%
  6. pause
复制代码

作者: hbb    时间: 2014-6-14 20:53

回复 2# apang


    谢谢您的热心回复,可能我没表达明白我的意思,我是想把我提取的结果的最后一个字符显示出来,谢谢!
作者: Batcher    时间: 2014-6-14 21:44

%%a:~-1% 没有这样的语法
不能直接对for循环的控制变量进行字符串截取
必须先赋值给一个临时变量,然后再截取。
作者: apang    时间: 2014-6-14 21:56

回复 3# hbb


    顶楼代码获取的最后一个字符是回车符,你是想把回车符显示出来吗?
作者: hbb    时间: 2014-6-14 22:06

回复 5# apang
  1. @echo off
  2. for /f "tokens=* delims=[2]-" %%a in ('wmic DISKDRIVE get signature ^| find /v /n "" ^| find "[2]"') do set id=%%a
  3. echo %id%
  4. call echo %id:~-1%
  5. pause
复制代码
我想取%id%变量的最后一个字符是个数字,不是回车,请教如何实现
作者: Batcher    时间: 2014-6-15 10:20

回复 6# hbb


call命令里面应该把%改成%%
  1. @echo off
  2. for /f "skip=1" %%a in ('wmic DISKDRIVE get signature') do (
  3.     set id=%%a
  4.     goto :next
  5. )
  6. :next
  7. echo %id%
  8. call echo %%id:~-1%%
  9. call echo %%id:~-2%%
  10. pause
复制代码

作者: hbb    时间: 2014-6-15 21:51

本帖最后由 hbb 于 2014-6-15 22:29 编辑

回复 7# Batcher


    谢谢管理员热心答复,我在以下命令中ID取值必须要为正数(由于执行wmic DISKDRIVE get signature命令得出的值有可能是负数),就是不要那个减号,并同时取ID数值的最后一位,所以还是需要for /f "tokens=* delims=[2]-"命令,现在关键需要解决执行“call echo %%id:~-1%%”后出现“ECHO 处于关闭”状态的问题。就是不知道是什么原因会出现“ECHO 处于关闭”状态?
  1. @echo off
  2. for /f "tokens=* delims=[2]-" %%a in ('wmic DISKDRIVE get signature ^| find /v /n "" ^| find "[2]"') do set id=%%a
  3. echo %id%
  4. call echo %%id:~-1%%
  5. pause
复制代码
还想请教管理员,为什么您的脚本中有以下代码就能正常显示结果,没有以下代码执行的话就不能正常显示?
  1. goto next
  2. )
  3. :next
复制代码
为什么我添加以上代码执行也不对呢?
  1. @echo off
  2. for /f "tokens=* delims=[2]-" %%a in ('wmic DISKDRIVE get signature ^| find /v /n "" ^| find "[2]"') do (
  3.     set id=%%a
  4.     goto next
  5. )
  6. :next
  7. echo %id%
  8. call echo %%id:~-1%%
  9. pause
复制代码

作者: terse    时间: 2014-6-15 23:55

测试可正常显示 环境win7
  1. @echo off
  2. for /f "skip=1tokens=*" %%a in ('wmic DISKDRIVE get signature') do for /f %%a in ("%%a") do if not defined id  set id=%%a
  3. echo %id:-=%
  4. echo %id:~-1%
  5. pause
复制代码

作者: Batcher    时间: 2014-6-16 09:40

回复 8# hbb


执行这个命令:
  1. wmic DISKDRIVE get signature | find /v /n "" | find "[2]" > a.txt
复制代码
用十六进制编辑器打开a.txt,就会发现行尾有几个不可见字符。
作者: hbb    时间: 2014-6-16 10:33

回复 10# Batcher


    是的,所以我用find命令来筛选第二行
作者: Batcher    时间: 2014-6-16 10:46

回复 11# hbb


    筛选的结果的行尾有几个不可见字符
作者: hbb    时间: 2014-6-17 10:12

本帖最后由 hbb 于 2014-6-17 10:14 编辑

回复 12# Batcher


   确实是有空白字符,不知道为什么用截取倒数第一个字符方式却截取不到空白字符??
作者: Batcher    时间: 2014-6-17 10:30

回复 13# hbb


    你不是需要截取最后一个数字吗,分别试试-2和-3
作者: hbb    时间: 2014-6-17 22:07

回复 14# Batcher


    确实是要截取数字,只是奇怪为什么截取不到空白字符
作者: Batcher    时间: 2014-6-17 22:25

回复 15# hbb


你看看这个:
  1. @echo off
  2. for /f "tokens=* delims=[2]-" %%a in ('wmic DISKDRIVE get signature ^| find /v /n "" ^| find "[2]"') do set id=%%a
  3. echo,%id:~-4%+++>a.txt
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2