如何替換 Windows 命令提示字元中的「cut」?

如何替換 Windows 命令提示字元中的「cut」?

我有一個包含一組子資料夾的目錄,與名稱模式匹配,例如:

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
)

相關內容