中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [探讨][征集][去变量左右、首尾空格的方法]
« [1] [2] »
作者:
标题: [探讨][征集][去变量左右、首尾空格的方法] 上一主题 | 下一主题
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『楼 主』:  [探讨][征集][去变量左右、首尾空格的方法]

去左、右含有空格的变量试验 与 另类方法实现演示

(测试版本: Windows  CMD  Shell )
(      纯dos下此代码无效)

(特殊特号等意外问题下面代码中不考虑,只演示原理)



(这篇贴子的原由:在纯DOS交流区看到一遍“如何忽略掉用户输入路径前后的空格?”的属于CMD Shell内容的文章)

(        原提问贴:http://www.cn-dos.net/forum/viewthread.php?tid=25062&sid=qljZ68)
(        以致于对 CMD Shell 感兴趣的网友没有注意到纯DOS区内的非纯DOS内容)
(        贴子发错了讨论区,就象是把重要的财务部收的文件直接放到了售后服务部…)
(        建议:要快速的及时解决问题,请千万不要把贴子发错讨论区~:)
@echo %dbg% off
cls && echo. && echo.
:Redtek 2006 去左、右含有空格的变量试验与另类方法实现演示
::  为演示与另做它用方便,所以“标签代码段”内的代码都可以独立使用

set "var=               My name is Redtek            "



rem  注:下面 Call 中的参数是无引号的,利用参数以逗号空格等做为分隔的特性
call :去左侧空格  %var%

echo. && echo.

call :去右侧空格  "%var%"

rem  去字符串中的左、右空格
rem  为演示与另做它用的方便,下面步骤将重新编写去左右空格的代码段,可以独立使用。

echo. && echo.

call :去两边空格  "%var%"  %var%

goto :eof



:去左侧空格

        rem  利用替换原理,将变量 var 中 以 ^%1变量内容开头字串的左边一切替换为^1本身
        rem  因为被 Call 过来以后,参数中的空格就全“丢了”(利用参数分隔的特性),
        rem  所以,自然那个要被定位的 ^%1 左边的空格也就全没了。

        call set "去左空格后的变量=%%var:*%1=%1%%

        echo  原字符串:                [%var%]
        echo  去左侧空格后的字符串:        [%去左空格后的变量%]
        goto  :eof


:去右侧空格

        rem 将结果赋值给变量,这个变量可以随便调用。
        rem ~nx 是利用了“将变量扩展到一个文件名”的特性,
        rem 既然是合法的文件名,当然文件名后面的空格是无效且无用的~:)

        set 去右空格后的变量=%~nx1

        echo  原字符串:                [%var%]
        echo  去右侧空格后的字符串:        [%去右空格后的变量%]
        goto  :eof       
       

:去两边空格

        rem 原理:先去左边空格,再去右边空格,相当于上面演示代码的合用:)
        rem    在假如没有上面两段去左和去右空格的代码情况下,下面独立演示:

        set 去左右空格后的变量=%~nx1
        call set "去左右空格后的变量=%%去左右空格后的变量:*%2=%2%%"

        echo  原字符串:                [%var%]
        echo  去左右空格后的字符串:        [%去左右空格后的变量%]
        goto :eof
       
代码全加了注释,以方便阅读:)


(输出测试结果:)
原字符串:                [               My name is Redtek            ]
去左侧空格后的字符串:        [My name is Redtek            ]


原字符串:                [               My name is Redtek            ]
去右侧空格后的字符串:        [               My name is Redtek]


原字符串:                [               My name is Redtek            ]
去左右空格后的字符串:        [My name is Redtek]
但,上面代码的实现方法并不是唯一,也不是最简单的方法,它只代表一种另类的实现。
所以请不要当此贴为唯一的解决方案,也不要将此贴的方法完全认为是正确的。


(此贴也为抛砖引玉,希望感兴趣的朋友继续增加不同的实现方法,越好玩越好~:)

[建议]请感兴趣的朋友一定要跟贴加入你常用的技巧,以方便入门的初学者参考和大家之间的交流,同时增加论坛人气~:)

[ Last edited by redtek on 2006-11-29 at 10:32 AM ]

   此帖被 +14 点积分      点击查看详情   
评分人:【 ccwan 分数: +4  时间:2006-11-29 03:53
评分人:【 NaturalJ0 分数: +5  时间:2006-11-29 03:58
评分人:【 lxmxn 分数: +5  时间:2006-11-29 05:46




    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-29 02:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 2 楼』:  

redtek 的方法很巧妙啊。

call set "去左空格后的变量=%%var:*%1=%1%%

这两个红色的地方想请教下。

2006-11-29 03:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 3 楼』:  





三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-11-29 03:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 4 楼』:  

call set "去左空格后的变量=%%var:*%1=%1%%中的 “*” 号:

原变量是: 
set "var=               My name is Redtek            "

那个 * 号就是相当于用 %1 (就是上面变量中的 My )来替换 var 变量中的 *%1(指 字符串 My 左边的一切字符)。



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-29 04:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 5 楼』:  

经你提醒,想起 namejm 给我的去引号方法了,现在全看明白了。^_^

2006-11-29 04:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 6 楼』:  

NaturalJ0兄也把你的一些去空格的方法贴上吧,无论是VBS还是JS还是Debug等……
我们让这些操作的方法都全了吧~:)

这样又方便索引查找去空格的方法又提高大家交流的某个专项内容的热情~:)

[ Last edited by redtek on 2006-11-28 at 03:44 PM ]



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-29 04:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 7 楼』:  

哇,你当我是高手啊。 o_O
其实 VBS JS DEBUG 我都不会的说。

2006-11-29 04:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 8 楼』:  

那些我也不会,哈哈……



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-29 04:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 9 楼』:  

不瞒各位,偶也是都不会。
给大家看看我手底下全部的JS材料,别笑偶。

附件 1: .JS.rar (2006-11-29 05:24, 547 bytes, 下载附件所需积分 1 点 ,下载次数: 50)


三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-11-29 05:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 10 楼』:  


  哇,还有这么多人和我一样,都不会哈~哈哈~

  Redtek 兄真是show得精彩,加分没商量~


2006-11-29 05:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 11 楼』:  


  我加一个去掉全部空格的……
@echo %dbg% off
set "var=    W W W . C N - D O S . N E T    "
echo [%var%]
set var=%var: =%
echo [%var%]
pause


   此帖被 +5 点积分      点击查看详情   
评分人:【 redtek 分数: +5  时间:2006-11-29 07:03


2006-11-29 05:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 12 楼』:  

其实用 vbs的ltrim 和 rtrim 和trim 就行鸟




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-11-29 06:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 13 楼』:  

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

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

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

[ Last edited by namejm on 2007-6-21 at 06:58 PM ]

   此帖被 +9 点积分       点击查看详情   
评分人:【 redtek 分数: +9  时间:2006-11-29 07:42




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-11-29 07:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 14 楼』:  

欣赏~~版主的代码甚是精彩!!!
现在去空格的方法越来越全啦~:)))



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-29 07:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 15 楼』:  

sed,任何特殊字符都考虑

去掉左侧所有空格:
echo "%var%"|sed -e "s/^\x22//;s/\x22$//" -e "s/^[ \t]*//"|more>test.txt
set /p var=<test.txt

去掉右侧所有空格:
echo "%var%"|sed -e "s/^\x22//;s/\x22$//" -e "s/[ \t]*$//"|more>test.txt
set /p var=<test.txt

去掉首尾所有空格:
echo "%var%"|sed -e "s/^\x22//;s/\x22$//" -e "s/^[ \t]*//;s/[ \t]*$//"|more>test.txt
set /p var=<test.txt

去掉所有空格:
echo "%var%"|sed -e "s/^\x22//;s/\x22$//" -e "s/ //g"|more>test.txt
set /p var=<test.txt

[ Last edited by vkill on 2006-11-29 at 08:04 AM ]

   此帖被 +3 点积分     点击查看详情   
评分人:【 lxmxn 分数: +3  时间:2006-11-29 08:05


2006-11-29 08:02
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: