文章目錄
- 前言
- `%~dp0`的含義
- 擴充字元串
- 從字元串中截取路徑、檔案名
-
- 腳本傳參
- for文法擴充
- 總結
前言
又是實際開發中的問題,想要截取一個檔案路徑中的盤符、檔案名等資訊,第一反應是正規表達式?或者是
split
函數?這些往往都是“進階”語言中才會有的實作方法,對于批處理來說有點“帶不動”啊,那麼在bat批進行中要怎樣處理類似的請求呢?最近找到了兩種方法,接下來會逐一展示一下,不過在展示具體的寫法前,我們先來看一下
%~dp0
的含義。
%~dp0
的含義
%~dp0
關于
%~dp0
的作用在之前的總結中 《.bat批處理(四):路徑相關%cd%和%~dp0的差別》 有提到過,它表示目前運作的批處理檔案所在的目錄,那麼它是一個特殊的變量嗎?
可以說算是吧,這個變量特殊在它是從參數變量
%0
擴充而來的,提到
%0
很多人都會想到它是批處理腳本的第一個參數,表示目前運作的腳本全路徑,可以寫個腳本試一下:
# Albert at home-pc in D:\data\bat [0:03:25]
% Get-Content showparams.bat
@echo off
echo %0
echo %1
# Albert at home-pc in D:\data\bat [0:03:31]
% ./showparams.bat good
"D:\data\bat\showparams.bat"
good
類似的變量還有
1%
、
2%
、
3%
… 一直到
9%
,都依次表示運作批處理腳本時傳入的參數,這些變量還有一個本領,那就是支援擴充,寫起來花裡胡哨的。
擴充字元串
擴充字元串是批處理自帶的功能,可以實作對表示檔案路徑的字元串進行特殊的處理,以
%0
參數為例,具體功能列舉如下:
-
- 删除路徑中的引号%~0
-
- 将 %0 擴充到一個完全合格的路徑名%~f0
-
- 将 %0 擴充到一個驅動器号%~d0
-
- 将 %0 擴充到一個路徑%~p0
-
- 将 %0 擴充到一個檔案名%~n0
-
- 将 %0 擴充到一個檔案擴充名%~x0
-
- 将 %0 擴充的路徑隻含有短名%~s0
-
- 将 %0 擴充到檔案的檔案屬性%~a0
-
- 将 %0 擴充到檔案的日期/時間%~t0
-
- 将 %0 擴充到檔案的大小%~z0
-
查找變量%~$PATH:0
在環境變量0%
的目錄,并将$PATH
擴充到找到的第一個完全合格的名稱,%0
未被定義或沒找到檔案,則結果為空字元串$PATH
當然這個寫法也可以進行組合,比如
%~d0
和
%~p0
組合後變成
%~dp0
也就是我們常見的那個變量啦~
可以将這些變量列印出來看一下具體的值:
# Albert at home-pc in D:\data\bat [0:26:17]
% Get-Content showparams.bat
@echo off
echo %0
echo %~0
echo %~f0
echo %~d0
echo %~p0
echo %~n0
echo %~x0
echo %~s0
echo %~a0
echo %~t0
echo %~z0
echo %~dp0
echo %~nx0
# Albert at home-pc in D:\data\bat [0:26:28]
% .\showparams.bat
"D:\data\bat\showparams.bat"
D:\data\bat\showparams.bat
D:\data\bat\showparams.bat
D:
\data\bat\
showparams
.bat
D:\data\bat\showparams.bat
--a--------
2021/10/17 00:26
156
D:\data\bat\
showparams.bat
從字元串中截取路徑、檔案名
上面的部分解釋了
%~dp0
,同時也知道了這些腳本參數指出擴充文法,如果是普通變量的話就不能使用擴充文法了,那麼對于一個普通的包含字元串怎麼才能使用擴充文法,截取到想要的部分呢?目前我知道的有兩種方法:一種是傳參使其變成腳本參數,也就是
%n
的形式,另一種方法就是使用
for
語句,接下來分别看一下。
腳本傳參
普通的字元串無法進行擴充,如果想把這種變量就需要把它們變成腳本參數,這就需要将參數傳遞給另一個腳本,這樣實作起來會将腳本調用變得複雜一些,實際上可以在一個腳本中完成截取工作,類似于C/C++中的函數調用,可以在批進行中使用
call
指令搭配标簽實作,具體代碼如下:
# Albert at home-pc in D:\data\bat [17:37:54]
% Get-Content extract1.bat
@echo off
set OriginStr="C:/Demo/myproject/example.txt"
echo %OriginStr%
call :extract %OriginStr%
goto :eof
:extract
rem 擷取到檔案路徑
echo %~dp1
rem 擷取到檔案盤符
echo %~d1
rem 擷取到檔案名稱
echo %~n1
rem 擷取到檔案字尾
echo %~x1
# Albert at home-pc in D:\data\bat [17:41:25]
% .\extract1.bat
"C:/Demo/myproject/example.txt"
C:\Demo\myproject\
C:
example
.txt
在這段代碼中
:eof
标簽是一個預設的标簽,表示檔案結尾,實際需求中需根據具體要求進行調整。
for文法擴充
使用 for 循環是另一種實作方式,因為循環變量也可以支援擴充,可以将需要截取的字元串路徑放在循環範圍中,然後先循環輸出測試下:
# Albert at home-pc in D:\data\bat [17:46:29]
% Get-Content extract2.bat
@echo off
set OriginStr="C:/Demo/myproject/example.txt"
for %%I in (%OriginStr%) do echo %%I
# Albert at home-pc in D:\data\bat [17:46:57]
% .\extract2.bat
"C:/Demo/myproject/example.txt"
在批進行中的循環變量是
%%I
的形式,需要兩個 % 才可以,後面的變量名可以換成26個字母中的任意一個,并且字母會區分大小寫,然後利用這些循環變量就可以進行擴充,然後完成最開始的需求,實作代碼如下:
# Albert at home-pc in D:\data\bat [17:53:53]
% Get-Content extract2.bat
@echo off
set OriginStr="C:/Demo/myproject/example.txt"
for %%I in (%OriginStr%) do echo %%I
rem 擷取到檔案路徑
for %%I in (%OriginStr%) do echo %%~dpI
rem 擷取到檔案盤符
for %%I in (%OriginStr%) do echo %%~dI
rem 擷取到檔案名稱
for %%I in (%OriginStr%) do echo %%~nI
rem 擷取到檔案字尾
for %%I in (%OriginStr%) do echo %%~xI
# Albert at home-pc in D:\data\bat [17:54:01]
% .\extract2.bat
"C:/Demo/myproject/example.txt"
C:\Demo\myproject\
C:
example
.txt
這種寫法的好處就是無需控制标簽跳轉流程,通過循環指令 for 就可以擷取想要的參數,使用起來會友善很多。
總結
- 在批處理檔案中
表示批處理檔案所在的目錄,而%~dp0
表示執行指令時所在的目錄%cd%
- 在批處理檔案中想要截取目錄操作可以使用變量擴充來實作,而變量必須是
的形式,其中的%i
是可以是i
a~zA~Z0~9
- for 表達式中的循環變量在cmd指令行中是
的形式,而在批處理檔案中需要協程%i
的形式%%i
- 常用的變量擴充有:擷取到檔案盤符使用
,擷取到檔案名稱使用%~d0
,擷取到檔案字尾使用%~n0
%~x0
==>> 反爬連結,請勿點選,原地爆炸,概不負責!<<==
反人性需要不斷修煉,逆向思維才能戰勝人性的弱點,很多時候事情往往不是你想的那樣~