天天看點

.bat批處理(十):從路徑字元串中截取盤符、檔案名、字尾名等資訊前言%~dp0的含義擴充字元串從字元串中截取路徑、檔案名總結

文章目錄

  • 前言
  • `%~dp0`的含義
  • 擴充字元串
  • 從字元串中截取路徑、檔案名
    • 腳本傳參
    • for文法擴充
  • 總結

前言

又是實際開發中的問題,想要截取一個檔案路徑中的盤符、檔案名等資訊,第一反應是正規表達式?或者是

split

函數?這些往往都是“進階”語言中才會有的實作方法,對于批處理來說有點“帶不動”啊,那麼在bat批進行中要怎樣處理類似的請求呢?最近找到了兩種方法,接下來會逐一展示一下,不過在展示具體的寫法前,我們先來看一下

%~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

    - 删除路徑中的引号
  • %~f0

    - 将 %0 擴充到一個完全合格的路徑名
  • %~d0

    - 将 %0 擴充到一個驅動器号
  • %~p0

    - 将 %0 擴充到一個路徑
  • %~n0

    - 将 %0 擴充到一個檔案名
  • %~x0

    - 将 %0 擴充到一個檔案擴充名
  • %~s0

    - 将 %0 擴充的路徑隻含有短名
  • %~a0

    - 将 %0 擴充到檔案的檔案屬性
  • %~t0

    - 将 %0 擴充到檔案的日期/時間
  • %~z0

    - 将 %0 擴充到檔案的大小
  • %~$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

==>> 反爬連結,請勿點選,原地爆炸,概不負責!<<==

反人性需要不斷修煉,逆向思維才能戰勝人性的弱點,很多時候事情往往不是你想的那樣~