如何在 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

“项目”并不完全是由与星号匹配的字符串构建的,但它是等效的。

答案2

我还找到了一个直接的答案。它接近于 cut 语义。

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
)

相关内容