我有一個包含一組子資料夾的目錄,與名稱模式匹配,例如:
sub-123
sub-0815
sub-4711
在這個資料夾中,我有一些檔案的名稱與資料夾名稱中的編號相同。例如資料夾 sub-123 包含文件
input-123
output-123
我想迭代該資料夾,將工作目錄變更為目前資料夾,並使用適當的資料集進行一些處理。雖然我可以迭代資料夾
for /d %%d in (sub-*) do .
我需要資料夾名稱的一部分,即與星號相符的部分,在上面的範例中為“123”。如何從資料夾名稱中提取 123 並建立如下命令
cd sub-123
copy input-123 output-123
在 Windows-7 批次檔中?在 Linux 環境中,可以使用 cut 指令或任何正規表示式。但是我應該如何進入 Windows 命令提示字元呢?
答案1
我自己找到的。 set 指令具有增強的變數替換功能。但它不能用於for
身體本身。有必要啟動一個新的 bacth 呼叫上下文:
for /d %%d in (sub-*) do (
set item=%%d
pushd %%d
call :build
popd
)
goto :eof
:build
set item=%item:sub-=%
copy input-%item% output-%item%
:eof
「item」並不完全是根據與星號相符的字串建構的,但它是等效的。
答案2
我還找到了一個直接的答案。它接近剪切語義。
set 指令也有子字串語法。若要跳過 n 個字符,請使用%variable:~n%
.若要取得從偏移量 k 開始的 n 個字符,請使用%variable:~k,n%
for /d %%d in (sub-*) do (
set item=%%d
set num=%item:~4%
pushd %%d
copy input-%num% output-%num%
popd
)