windows bat系列11:for處理案例四 去掉字串中的空格

那個少年發表於2018-08-02

背景

不管學習何種程式語言,何種程式設計指令碼,對字串的處理都是必備的基礎知識之一。本文講述BAT批處理指令碼中如何去掉字串中的空格。

原始碼

@echo off

set str_left="   with left space"
set str_right="with right space   "
set str_space="   many    space   "

echo -------------Before strim---------------
echo=

echo %str_left% 
echo %str_right%
echo %str_space%

echo=
echo -------------After strim---------------

CALL :StripLeft %str_left%
echo "%G_STRIP_LEFT_RETURN%"

CALL :StripRight %str_right%
echo "%G_STRIP_RIGHT_RETURN%"

CALL :StripLR %str_space%
echo "%G_STRIP_LR_RETURN%"

set strimALL=%str_space: =%
echo %strimALL%

pause


Rem ------------for call function---------
:StripLeft
for /f "tokens=*" %%i in (%1) do SET G_STRIP_LEFT_RETURN=%%i
GOTO:EOF

:StripRight
Rem n、x表示命令的選項,分別表示檔名、檔案擴充套件
Rem delims表示指定分隔符為空格
for /f "delims=" %%i in (%1) do SET G_STRIP_RIGHT_RETURN=%%~nxi
GOTO:EOF

:StripLR
Rem n、x表示命令的選項,分別表示檔名、檔案擴充套件
for /f "tokens=*" %%i in (%1) do SET G_STRIP_LR_RETURN=%%~nxi
GOTO:EOF

原始碼說明

  1. 原始碼設定了四種場景:去掉左邊空格、去掉右邊空格、去掉左右兩邊空格、去掉所有空格;設定了三個變數str_leftstr_rightstr_space)用於測試;
  2. 針對前三種場景,使用了call的命令擴充套件用法,即call 後面帶標籤去執行標籤程式碼DOS幫助文件的解釋如下:
    If Command Extensions are enabled CALL changes as follows: CALL command now accepts labels as the target of the CALL.  The syntax is: 
    CALL :label arguments
    
  1. 為了便於觀察去掉空格操作導致字串的變化,我在定義變數時在字串兩側增加了雙引號包含字串內容,這樣處理前echo變數不需要帶引號,而在後面的for語句中%1(表示第一個引數)沒有帶引號,導致處理後再echo變數需要帶引號……有點混亂,請讀者自測
  2. 標籤StripRight的處理使用了for語句中delims,指示用預設的分隔符(空格、tab)分割字串,後面的%%~nxi使用了命令擴充套件用法,原生態解釋如下(call /?):
%~n1        - expands %1 to a file name only
%~x1        - expands %1 to a file extension only
  1. Pause語句放到所有標籤命令塊的前面,不然會被當作標籤命令塊的一部分

測試結果

參考

DOS刪除空格​​​​​​​

相關文章