找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 133415|回复: 16

[文本处理] 批处理如何去掉字符串两边的空格

[复制链接]
发表于 2008-1-2 19:12:28 | 显示全部楼层 |阅读模式
想写一个可以去掉字符串两边空格的批处理,做为函数调用,可是却不知从何下手
请诸位帮忙.......
如 set "str=    abc d  "
结果为
"str=abc d"

[ 本帖最后由 胡子轩 于 2008-1-3 09:55 编辑 ]
发表于 2008-1-2 20:06:14 | 显示全部楼层
当然,可以用if来检测。
但是因为受 联盟里 3742版主的影响,不太喜欢if,所以尽量不用...
测试代码:

  1. @echo off
  2. set "str=    abc   df  fd       d     "
  3. for /f "tokens=* delims= " %%i in ("%str%") do set "str=%%i"
  4. set str=%str: = # %
  5. call :Rev "%str%"
  6. for /f "tokens=* delims=#" %%i in ("%Res%") do set "str=%%i"
  7. set "str=%str:#= # %"
  8. call :Rev "%str%"
  9. echo "%Res:#= %"
  10. pause>nul
  11. :Rev str
  12. set "Res="
  13. for %%i in (%~1) do call set Res=%%i%%Res%%
复制代码
发表于 2008-1-2 21:22:41 | 显示全部楼层
我来一个if的
  1. @echo off
  2. set "str=    abc d  "
  3. for /f "tokens=* delims= " %%a in ("%str%") do (
  4.         set "var=%%a"
  5.         call :ie
  6.     )
  7. echo.
  8. echo  去除空格前:  [%str%]
  9. echo.
  10. echo  去除空格后:  [%var%]
  11. echo.
  12. pause&goto :eof


  13. :ie
  14. if "%var:~-1%"==" " (set "var=%var:~0,-1%"&goto ie) else goto :eof
复制代码
发表于 2008-1-2 21:46:39 | 显示全部楼层
呵呵,楼上的不错,先通过for循环消除开头的 空格,然后用if来检测(个人不太喜欢)...
也有几点建议:
1、标签中的变量设置不甚恰当。
程序中的var变量在这里最好放到标签:ie里,特别是比较长的程序的话,你就知道好处了。
2、那个else似乎没什么用处。
改成以下代码是否好点呢?
  1. @echo off
  2. set "str=    abc d  "
  3. for /f "tokens=* delims= " %%a in ("%str%") do call :ie "%%a"
  4. echo.
  5. echo  去除空格前:  [%str%]
  6. echo.
  7. echo  去除空格后:  [%var%]
  8. echo.
  9. pause&goto :eof

  10. :ie str
  11. set "var=%~1"
  12. if "%var:~-1%"==" "  call :ie "%var:~0,-1%"
复制代码
发表于 2008-1-2 22:13:47 | 显示全部楼层
呵呵,楼上的不错,先通过for循环消除开头的 空格,然后用if来检测(个人不太喜欢)...
也有几点建议:
1、标签中的变量设置不甚恰当。
程序中的var变量在这里最好放到标签:ie里,特别是比较长的程序的话,你就知道好处了。
2、那个else似乎没什么用处。
改成以下代码是否好点呢?


谢谢提点,确实,那个变量var放在子标签中很好,"程序"归"程序","函数"归"函数".

我个人也很喜欢用"函数"的方式来编写代码,再者水平有限,编写不出什么大型

的脚本,所以在这些方面有所忽略.
  1. if "%var:~-1%"==" "  call :ie "%var:~0,-1%"
复制代码
你这一行代码以前没有看到这种用法,现在才知道,学习ing. . .
发表于 2008-1-2 22:56:13 | 显示全部楼层
学习了。
@echo off
set "str=    abc   df  fd       d     "
for /f "tokens=* delims= " %%i in ("%str%") do set "str=%%i"
echo %str%
这里的是abc   df  fd       d  
不是去掉空格了吗?
发表于 2008-1-2 23:06:05 | 显示全部楼层
呵呵,你这个其实 还没去掉d后面的空格的///
发表于 2008-1-2 23:07:41 | 显示全部楼层
No,非也,6楼请仔细看咯,d后面还有空格呢,只是看不到而己,看下面代码,用括号括起来就方便看了
  1. @echo off
  2. set "str=    abc   df  fd       d     "
  3. for /f "tokens=* delims= " %%i in ("%str%") do set "str=%%i"
  4. echo [%str%]
  5. pause
复制代码

[ 本帖最后由 ieutk 于 2008-1-2 23:09 编辑 ]
发表于 2008-1-2 23:24:07 | 显示全部楼层
  转一下以前写的代码:

  去掉左侧空格1:
  1. @echo off
  2. set "str=   ab c&>!   "
  3. for /f "tokens=*" %%i in ("%str%") do echo "☆%%i☆"
  4. pause
复制代码
  去掉左侧空格2:
  1. @echo off
  2. set "str=   ab c&>!   "
  3. :intercept
  4. if "%str:~0,1%"==" " set "str=%str:~1%"&goto intercept
  5. echo "☆%str%☆"
  6. pause
复制代码
  去掉右侧空格1:
  1. @echo off
  2. set "str=   ab c&>!   "
  3. for /f "delims=" %%i in ("%str%") do echo "☆%%~nxi☆"
  4. pause
复制代码
  去掉右侧空格2:
  1. @echo off
  2. set "str=   ab c&>!   "
  3. :intercept
  4. if "%str:~-1%"==" " set "str=%str:~0,-1%"&goto intercept
  5. echo "☆%str%☆"
  6. pause
复制代码
  去掉首尾空格1:
  1. @echo off
  2. set "str=   ab c&>!   "
  3. for /f "tokens=*" %%i in ("%str%") do echo "☆%%~nxi☆"
  4. pause
复制代码
  去掉首尾空格2:
  1. @echo off
  2. set "str=   ab c&>!   "

  3. :intercept_left
  4. if "%str:~0,1%"==" " set "str=%str:~1%"&goto intercept_left

  5. :intercept_right
  6. if "%str:~-1%"==" " set "str=%str:~0,-1%"&goto intercept_right
  7. echo "☆%str%☆"
  8. pause
复制代码
  去掉所有空格:
  1. @echo off
  2. set "str=   ab c&>!   "
  3. set "str=%str: =%"
  4. echo "☆%str%☆"
  5. pause
复制代码
  以上代码能兼容除双引号外的其他特殊字符。

评分

参与人数 2PB +20 收起 理由
foxJL + 10 受益匪浅
youxi01 + 10 精品文章

查看全部评分

发表于 2008-1-2 23:42:45 | 显示全部楼层
呵呵,这个以前就拜读过了,只是当初没太注意,也没去想原理;原来蛮有应用价值的嘛!
精品就是精品啊,哈哈!!
发表于 2008-1-2 23:53:45 | 显示全部楼层
namejm出手必属精品
发表于 2008-1-3 01:43:25 | 显示全部楼层
也来个不能显示特殊字符,
去除首尾空格
:
  1. @echo off
  2. set "str=   ab     c    "
  3. call :lis %str%
  4. pause
  5. :lis
  6. echo ☆%*☆
  7. goto :eof
复制代码

评分

参与人数 1PB +5 收起 理由
youxi01 + 5

查看全部评分

发表于 2008-1-3 07:46:10 | 显示全部楼层
好,值得加分!!
在联盟qw版主写的 数字排序 程序里出现过这种用法:%*
发表于 2008-1-4 19:35:32 | 显示全部楼层
对于楼上的 namejm 和 随风 兄弟的代码,应该来说,可以比较好的解决楼主的问题,但是也有瑕疵:
1、随风兄弟的现行代码 无法处理 特殊字符;
2、namejm的代码:
  1. @echo off
  2. set "str=   ab c&>!   "
  3. for /f "tokens=*" %%i in ("%str%") do echo "☆%%~nxi☆"
  4. pause
复制代码
namejm的代码是利用了CMD对文件路径、文件名的“解析漏洞”很好的去掉了字符串首尾两端的空格,但是还存在一些小问题,测试代码:
  1. @echo off
  2. set "str=   ab\ c&>!  .  "
  3. for /f "tokens=*" %%i in ("%str%") do echo "☆%%~nxi☆"
  4. pause
复制代码
运行结果会抛弃"ab"和"."
呵呵,欢迎大家继续讨论!
发表于 2008-1-5 13:34:42 | 显示全部楼层
极其臃肿.
:
  1. @echo off
  2. set "str=   a\b c&>! .  "
  3. call :lis
  4. set flag=1
  5. :lis
  6. set var=
  7. for /l %%i in (1 1 100) do (
  8.    if defined str (
  9.    call set "var=%%var%%%%str:~-1%%"
  10.    call set "str=%%str:~0,-1%%"
  11. ))
  12. set "str=%var%"
  13. for /f "tokens=*" %%a in ("%str%") do set "str=%%a"
  14. if not defined flag goto :eof
  15. echo "%str%"
  16. pause
复制代码





...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 17:04 , Processed in 0.020598 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表