我有一个目录,其中包含一组子文件夹,与名称模式匹配,例如:
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
)