带有regex路径字符串的dir子树



我有这样的文件树:

C:UsersuserAppDataLocalapp-packageblabla
C:UsersuserAppDataLocalapp-packageblablasomething
C:UsersuserAppDataLocalapp-packageapp-1.1.6
C:UsersuserAppDataLocalapp-packageapp-1.1.6resources
C:UsersuserAppDataLocalapp-packageapp-1.1.6resourcesapp.package.unpacked
C:UsersuserAppDataLocalapp-packageapp-1.1.6resourcesapp.package.unpackeddaemon

我试过命令

D:tmp>dir /B/S/AD "%LOCALAPPDATA%app-packageapp*"

预期:

C:UsersuserAppDataLocalapp-packageapp-1.1.6
C:UsersuserAppDataLocalapp-packageapp-1.1.6resources
C:UsersuserAppDataLocalapp-packageapp-1.1.6resourcesapp.package.unpacked
C:UsersuserAppDataLocalapp-packageapp-1.1.6resourcesapp.package.unpackeddaemon

实际输出:

C:UsersuserAppDataLocalapp-packageapp-1.1.6
C:UsersuserAppDataLocalapp-packageapp-1.1.6resourcesapp.package.unpacked

为什么会发生这种情况,我该如何解决?

您似乎认为通配符app*只与给定目标目录中的项匹配,但实际上它与路径的最后一个元素匹配。这就解释了为什么:

dir /B/S/AD "%LOCALAPPDATA%app-packageapp*"

提供以下结果:

C:UsersuserAppDataLocalapp-packageapp-1.1.6
C:UsersuserAppDataLocalapp-packageapp-1.1.6resourcesapp.package.unpacked

app*更改为app-*,输出将仅为:

C:UsersuserAppDataLocalapp-packageapp-1.1.6

我认为您需要以下内容:

pushd "%LOCALAPPDATA%app-package" && (for /F "eol=| delims=" %I in ('dir /B /A:D-H-S "app-*"') do @echo(%~fI& dir /S /B /A:D-H-S "%I" & popd)

为了更好地理解它的作用,这里有一个带有一些解释性注释的批处理文件版本:

@echo off
rem // Change into the target directory:
pushd "%LOCALAPPDATA%app-package" && (
rem // Loop through matching directories within target directory:
for /F "eol=| delims=" %%I in ('dir /B /A:D-H-S "app-*"') do (
rem // Return matching sub-directory itself:
echo(%%~fI
rem // Return contents of matching sub-directory:
dir /S /B /A:D-H-S "%%I"
)
rem // Return from the target directory:
popd
)

最新更新