我正在尝试编写一个脚本,帮助浏览包含大量文件夹、名称和编号的大型库。零件编号分为 4 个部分XXX.XX.XX.XXXX。为了帮助搜索,库文件夹设置如下:(示例名称)100_植物\01_花\01_红色\0001_玫瑰
我的问题是文件夹的名称,如果文件夹的名称仅为“100”,则很容易浏览。这是我用来分隔零件编号并尝试打开文件夹的代码。
set /p pnr="Please enter the PNR : "
echo %pnr%
echo %pnr:~0,3%
echo %pnr:~4,2%
echo %pnr:~7,2%
echo %pnr:~10,4%
explorer ".library\%pnr:~0,3%(*)"
我想打开一个包含零件编号前 3 位数字的文件夹。您能帮我解决这个问题吗?我试过用星号,但它打开了资源管理器...
谢谢。
答案1
假设 pnr 中的号码在文件夹树中是唯一的,则以下批处理将通过连续迭代直接打开与所有 4 个号码匹配的文件夹for /d loops
请注意,for 元变量区分大小写,
因此 pnr 被拆分成%%A..%%D
并找到的文件夹位于%%a..%%d
我的 RAM 驱动器 A 上的示例树:
> tree
A:.
└───.library
└───100_Vegetal
└───01_Flower
└───01_Red
└───0001_Rose
:: Q:\Test\2018\10\26\SU_1370234.cmd
@Echo off
set "Base=A:\.library"
set /p pnr="Please enter the PNR : "
:: set pnr=100.01.01.0001
echo %pnr%
:: reset Level variables
for /l %%L in (1,1,4) do Set "Level%%L="
:: first split pnr, then dive into folders
for /f "tokens=1-4 delims=." %%A in ("%pnr%" ) Do (
for /d %%a in ("%Base%\%%A*") Do (Set Level1=%%a
for /d %%b in ("%%a\%%B*") Do (Set Level2=%%b
for /d %%c in ("%%b\%%C*") Do (Set Level3=%%c
for /d %%d in ("%%c\%%D*") Do (Set Level4=%%d
Explorer "%%d
)
)
)
)
)
:: set Level
示例输出:
> Q:\Test\2018\10\26\SU_1370234.cmd
Please enter the PNR :
100.01.01.0001
Level1=A:\.library\100_Vegetal
Level2=A:\.library\100_Vegetal\01_Flower
Level3=A:\.library\100_Vegetal\01_Flower\01_Red
Level4=A:\.library\100_Vegetal\01_Flower\01_Red\0001_Rose
Explorer 在此打开A:\.library\100_Vegetal\01_Flower\01_Red\0001_Rose
答案2
您可以使用目录命令及其/S /B /AD
参数对于/f循环并使其递归遍历源文件夹仅限目录然后使用通配符通过您键入的数字迭代这些文件夹,以便在资源管理器中打开。
脚本示例
set /p pnr="Please enter the PNR : "
set pnr=%pnr:~0,3%
FOR /F "TOKENS=*" %%a IN ('DIR /S /B /AD ".library\%pnr%*"') DO explorer "%%~fa"
更多资源
- 对于/F
FOR /?
tokens=x,y,m-n - specifies which tokens from each line are to be passed to the for body for each iteration. This will cause additional variable names to be allocated. The m-n form is a range, specifying the mth through the nth tokens. If the last character in the tokens= string is an asterisk, then an additional variable is allocated and receives the remaining text on the line after the last token parsed.
- 目录