中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 20:57
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [探讨][征集][去变量左右、首尾空格的方法]
楼 主 [探讨][征集][去变量左右、首尾空格的方法] 发表于 2006-11-29 02:43 ·  中国 北京 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
UID 63324
性别 男
状态 离线
去左、右含有空格的变量试验 与 另类方法实现演示

(测试版本: 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 原字符串:
echo 去左侧空格后的字符串:
goto :eof


:去右侧空格

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

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

echo 原字符串:
echo 去右侧空格后的字符串:
goto :eof


:去两边空格

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

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

echo 原字符串:
echo 去左右空格后的字符串:
goto :eof




代码全加了注释,以方便阅读:)


(输出测试结果:)


原字符串:
去左侧空格后的字符串:


原字符串:
去右侧空格后的字符串:


原字符串:
去左右空格后的字符串:



但,上面代码的实现方法并不是唯一,也不是最简单的方法,它只代表一种另类的实现。
所以请不要当此贴为唯一的解决方案,也不要将此贴的方法完全认为是正确的。


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

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

[ Last edited by redtek on 2006-11-29 at 10:32 AM ]
本帖最近评分记录 (共 3 条) 点击查看详情
评分人分数时间
ccwan +4 2006-11-29 03:53
NaturalJ0 +5 2006-11-29 03:58
lxmxn +5 2006-11-29 05:46
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2 发表于 2006-11-29 03:35 ·  中国 江苏 苏州 联通
银牌会员
★★★
积分 1,181
发帖 533
注册 2006-08-14 12:54
UID 60484
状态 离线
redtek 的方法很巧妙啊。

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

这两个红色的地方想请教下。
3 发表于 2006-11-29 03:56 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
UID 63486
来自 河北廊坊
状态 离线
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
4 发表于 2006-11-29 04:04 ·  中国 北京 东城区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
UID 63324
性别 男
状态 离线
call set "去左空格后的变量=%%var:*%1=%1%%中的 “*” 号:

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

那个 * 号就是相当于用 %1 (就是上面变量中的 My )来替换 var 变量中的 *%1(指 字符串 My 左边的一切字符)。
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
5 发表于 2006-11-29 04:14 ·  中国 江苏 苏州 联通
银牌会员
★★★
积分 1,181
发帖 533
注册 2006-08-14 12:54
UID 60484
状态 离线
经你提醒,想起 namejm 给我的去引号方法了,现在全看明白了。^_^
6 发表于 2006-11-29 04:31 ·  中国 北京 东城区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
UID 63324
性别 男
状态 离线
NaturalJ0兄也把你的一些去空格的方法贴上吧,无论是VBS还是JS还是Debug等……
我们让这些操作的方法都全了吧~:)

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

[ Last edited by redtek on 2006-11-28 at 03:44 PM ]
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
7 发表于 2006-11-29 04:48 ·  中国 江苏 苏州 联通
银牌会员
★★★
积分 1,181
发帖 533
注册 2006-08-14 12:54
UID 60484
状态 离线
哇,你当我是高手啊。 o_O
其实 VBS JS DEBUG 我都不会的说。
8 发表于 2006-11-29 04:51 ·  中国 北京 东城区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
UID 63324
性别 男
状态 离线
那些我也不会,哈哈……
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
9 发表于 2006-11-29 05:24 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
UID 63486
来自 河北廊坊
状态 离线
不瞒各位,偶也是都不会。
给大家看看我手底下全部的JS材料,别笑偶。
附件
.JS.rar (547 bytes, 下载附件所需积分 1 点, 下载次数: 50)
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
10 发表于 2006-11-29 05:45 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线

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

  Redtek 兄真是show得精彩,加分没商量~
11 发表于 2006-11-29 05:55 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线

  我加一个去掉全部空格的……

@echo %dbg% off
set "var= W W W . C N - D O S . N E T "
echo
set var=%var: =%
echo
pause
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
redtek +5 2006-11-29 07:03
12 发表于 2006-11-29 06:39 ·  中国 四川 成都 教育网
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
UID 42173
性别 男
状态 离线
其实用 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'>"
13 发表于 2006-11-29 07:36 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  去掉左侧空格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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
redtek +9 2006-11-29 07:42
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
14 发表于 2006-11-29 07:46 ·  中国 北京 东城区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
UID 63324
性别 男
状态 离线
欣赏~~版主的代码甚是精彩!!!
现在去空格的方法越来越全啦~:)))
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
15 发表于 2006-11-29 08:02 ·  中国 甘肃 甘南藏族自治州 合作市 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
sed,任何特殊字符都考虑

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

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

去掉首尾所有空格:
echo "%var%"|sed -e "s/^\x22//;s/\x22$//" -e "s/^*//;s/*$//"|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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
lxmxn +3 2006-11-29 08:05
论坛跳转: