批處理字符串截取的實(shí)現(xiàn)
在批處理中,set的功能有點(diǎn)繁雜:設(shè)置變量、顯示環(huán)境變量的名及值、做算術(shù)運(yùn)算、等待用戶(hù)的輸入、字符串截取、替換字符串,是我們常用的命令之一。
在字符串截取方面,新手因?yàn)闆](méi)能注意到偏移量的問(wèn)題,很容易提取到錯(cuò)誤的字符串,因此,特開(kāi)此帖,詳細(xì)解釋 set 截取字符的用法。
我們先來(lái)看一個(gè)例子:
set str=123456789
現(xiàn)在,我需要提取變量 str 中的第一個(gè)字符,那么,該怎么寫(xiě)命令呢?
set var=%str:~1,1%?我想,這很可能是很多粗懂set用法的新手們的第一反應(yīng),實(shí)際上,這條語(yǔ)句提取到的是字符"2",并不是我們想要的"1",也就是說(shuō),set var=%str:~1,1% 提取到的是字符串第二位上的字符,而不是第一位上的,這是什么原因呢?
原來(lái),set 命令從左到右做字符截取的時(shí)候,是以整個(gè)字符串的第一個(gè)字符為起點(diǎn)來(lái)計(jì)算要截取字符的偏移量的,也就是說(shuō),截取字符的時(shí)候,set 會(huì)計(jì)算提取后字符串的第一個(gè)字符相對(duì)于整個(gè)字符串第一個(gè)字符偏移了多少字符的長(zhǎng)度。請(qǐng)注意,set 是按偏移量而不是字符的絕對(duì)位置來(lái)提取字符的,這一點(diǎn)非常重要。只要牢記這一點(diǎn),大家在截取字符的時(shí)候,將會(huì)不再在這個(gè)問(wèn)題上犯錯(cuò)。
現(xiàn)在,我們可以把截取字符的命令用一條語(yǔ)句模式來(lái)表示,那就是:set var=%str:~偏移量,長(zhǎng)度%。
我們來(lái)詳細(xì)解讀這條語(yǔ)句模式的含義:
首先,我們需要把要操作的字符串賦予一個(gè)變量,在這條語(yǔ)句中,是把字符串賦予了變量 str ;然后,我們需要確定一下我們想提取的字符串是哪一部分,比如說(shuō)要提取字符串第2個(gè)字符及其之后的3個(gè)字符,或是提取字符串第5個(gè)字符及其之后的4個(gè)字符……,最后,計(jì)算偏移量及長(zhǎng)度,比如要提取字符串第2個(gè)字符及其之后的3個(gè)字符,那么,也就是提取相對(duì)于第一個(gè)字符偏移量為1、提取后的字符串長(zhǎng)度為4的字符串,寫(xiě)成語(yǔ)句就是:set var=%str:~1,4%。
到目前為止,我們只談到了很簡(jiǎn)單的截取操作,如果碰到比較復(fù)雜的提取需求,比如:提取第2個(gè)字符及其之后的所有字符、提取最后的3個(gè)字符、提取倒數(shù)第2個(gè)及其之前的3個(gè)字符、提取除了最后4個(gè)字符的字符串……那又該怎么辦呢?別著急,set 命令在設(shè)計(jì)的時(shí)候就已經(jīng)充分考慮到我們的復(fù)雜需求,只要對(duì)剛才我們提到的字符截取語(yǔ)句稍做改動(dòng),就可以很輕松地完成任務(wù)。
我們知道,數(shù)字的正負(fù)可以用±符號(hào)來(lái)表示,同樣的,方向的正反也可以用±來(lái)標(biāo)注。在 set 做字符截取的時(shí)候,引入了±符號(hào)來(lái)表示字符截取的方向:從左到右截取為+,從右到左截取為-,所以,set var=%str:~1,4% 也可以寫(xiě)成 set var=%str:~+1,+4% ,只是在從右到左截取的時(shí)候,情況發(fā)生了一點(diǎn)變化,那就是:偏移量的起點(diǎn)以整個(gè)字符串最后一個(gè)字符的后一位來(lái)計(jì)算?,F(xiàn)在,我們可以來(lái)回答上一段中提出的一些問(wèn)題:
- 提取最后的3個(gè)字符:set var=%str:~-3%
- 提取倒數(shù)第2個(gè)及其之前的3個(gè)字符:set var=%str:~-5,4%
- 提取除了最后4個(gè)字符的字符串:set var=%str:~0,-4%
看了上面三種需求的代碼,大家可能又會(huì)產(chǎn)生新的疑問(wèn):第一條怎么只有一個(gè)數(shù)字?。康谌龡l最后一個(gè)數(shù)字是負(fù)號(hào),又表示什么意思呢?
原來(lái),在 set var=%str:~偏移量,長(zhǎng)度% 這樣的語(yǔ)句中,如果沒(méi)有逗號(hào)及其之后的長(zhǎng)度,就表示截取偏移量位置上及其之后的所有字符,如果長(zhǎng)度的值為負(fù)數(shù),則表示拋棄最后幾個(gè)字符。
現(xiàn)在,我們可以對(duì)任意位置上的字符做提取工作了(假設(shè) set str=123456789):
① 提取1: set var=%str:~0,1% 或 set var=%str:~0,-8% 或 set var=%str:~-9,1%
② 提取2: set var=%str:~1,1% 或 set var=%str:~1,-7% 或 set var=%str:~-8,1%
③ 提取9: set var=%str:~8,1% 或 set var=%str:~8% 或 set var=%str:~-1,1% 或 set var=%str:~-1%
④ 提取123:set var=%str:~0,3% 或 set var=%str:~0,-6% 或 set var=%str:~-9,3%
⑤ 提取234:set var=%str:~1,3% 或 set var=%str:~1,-5% 或 set var=%str:~-8,3%
⑥ 提取789:set var=%str:~6,3% 或 set var=%str:~6% 或 set var=%str:~-3,3% 或 set var=%str:~-3%
最后,我們來(lái)總結(jié)一下字符截取的規(guī)律:
1、截取字符串可以用 set var=%str:~數(shù)值1,數(shù)值2% 這樣的語(yǔ)句來(lái)實(shí)現(xiàn);
2、字符的截取是以偏移量來(lái)計(jì)算的,而不是以字符的絕對(duì)位置來(lái)計(jì)算;
3、當(dāng)數(shù)值1為正數(shù)時(shí),表示從左到右截??;當(dāng)數(shù)值1為負(fù)數(shù)時(shí),表示從右到左截??;
4、當(dāng)數(shù)值2為正數(shù)時(shí),表示要截取后字符串的長(zhǎng)度;當(dāng)為負(fù)數(shù)時(shí),表示要拋棄的最后幾個(gè)字符長(zhǎng)度;
5、當(dāng)數(shù)值2及其之前的逗號(hào)不存在時(shí),表示截取的是第(數(shù)值1+1)個(gè)字符及其之后的所有字符;
案例1:從左往右截取,舍棄前4個(gè)字符
set var=123456789 echo %var:~4% pause ----------------------------- 運(yùn)行結(jié)果: 56789
案例2:從左往右截取,只要前3個(gè)字符
set var=123456789 echo %var:~0,3% pause ----------------------------- 運(yùn)行結(jié)果: 123
案例3:從右往左截取,截取3個(gè)字符
set var=123456789 echo %var:~0,-3% pause ----------------------------- 運(yùn)行結(jié)果: 123456
案例4:從左往右舍棄第1位,從右往左舍棄3位
set var=123456789 echo %var:~1,-3% pause ----------------------------- 運(yùn)行結(jié)果: 123456
- ~ 波浪號(hào)后面的數(shù)字:為正數(shù)表示舍棄變量的前位;
- , 逗號(hào)后面的數(shù)字為正數(shù)表示取變量的舍棄以后的前幾位;
- , 逗號(hào)后面為負(fù)數(shù)表示舍棄變量的后幾位
到此這篇關(guān)于批處理字符串截取的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)批處理字符串截取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows下定時(shí)利用bat腳本實(shí)現(xiàn)ftp上傳下載
這篇文章主要為大家詳細(xì)介紹了windows下定時(shí)利用bat腳本實(shí)現(xiàn)ftp上傳和下載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05批處理文件(bat文件)注冊(cè)dll批量注冊(cè)dll
有時(shí)候用電腦的時(shí)候遇到由于DLL文件丟失或損壞而造成的種種故障,大家都只知道只要重新注冊(cè)一下DLL文件就可以了2012-05-05在當(dāng)前目錄生成很漂亮的結(jié)構(gòu)樹(shù)的批處理dir.bat
在當(dāng)前目錄生成很漂亮的結(jié)構(gòu)樹(shù)的批處理dir.bat...2007-08-08后臺(tái)運(yùn)行bat定時(shí)器程序示例分享
當(dāng)我們要讓BAT處理程序在后臺(tái)運(yùn)行而不顯示DOC窗口時(shí),可以避免程序被誤關(guān)閉等情況的發(fā)生。下面以一個(gè)簡(jiǎn)單的例子說(shuō)明如何實(shí)現(xiàn)2014-03-03