获取文件名前的部分字符串作为目录

Get part of string before filename as directory

目录中有图像列表。我想创建一个只迭代所有文件的 bat 文件,并根据文件名在具有这些规则的目录中对它们进行排序,例如:

1812_1005541_5226_983_1B.tif
1812_1005541_5226_983_2B.tif
1812_1005541_5226_983_3B.tif

我希望每个结果都移动到:

1812_1005541_5226_983 / 1812_1005541_5226_983_1B.tif
1812_1005541_5226_983 / 1812_1005541_5226_983_2B.tif
1812_1005541_5226_983 / 1812_1005541_5226_983_3B.tif

这意味着我想通过分隔符“_”获取字符串的前4部分。 这是代码,你能建议我在这里进行更改以实现上述结果吗?

@echo off
setlocal enabledelayedexpansion
for %%A in (*.psd *.jpg *.tif) do (
   echo file found  %%A
   for /f "delims=" %%B in ("%%A") do set fname=%%~nB
   for /f "delims=" %%C in ("%%A") do set fextn=%%~xC
   for /f "tokens=1,5 delims=_" %%D in ("!fname!") do set folname=%%D
   echo folder name !folname!
   if not exist "!folname!" (
      echo Folder !folname! does not exist, creating
      md "!folname!"
   ) else (
      echo Folder !folname! exists
   )
   echo Moving file %%A to folder !folname!
   move "%%A" "!folname!"
   )
echo Finished
pause

提前致谢!

你基本上只需要改变你的方法来获取文件夹(看起来有点复杂,但具有没有固定标记的优点;获取除最后一个元素之外的所有元素。所以:1812_1005541_5226_983_1B.tif 将变为 1812_1005541_5226_9831945_2008835_5X.tif 将变为 1945_2008835

break>1812_1005541_5226_983_1B.tif
break>1812_1005541_5226_983_2B.tif
break>1812_1005541_5226_983_3B.tif
break>1945_2008835_5X.tif 

@echo off
setlocal enabledelayedexpansion
for %%A in (*.psd *.jpg *.tif) do (
   echo file found  %%A
   for /f "delims=" %%B in ("%%A") do set fname=%%~nB
   REM for /f "delims=" %%C in ("%%A") do set fextn=%%~xC

   for  %%D in ("X:!fname:_=\!") do set folname=%%~pD
   set "folname=!folname:\=_!"
   set "folname=!folname:~1,-1!"

   echo folder name !folname!
   if not exist "!folname!" (
      echo Folder !folname! does not exist, creating
      md "!folname!"
   ) else (
      echo Folder !folname! exists
   )
   echo Moving file %%A to folder !folname!
   move "%%A" "!folname!"
   )
echo Finished
tree /f
pause

for /f %%D in ("!fname:_=\!") do set folname=%%~pD\ 替换每个 _,然后得到 "path" (%%~pD),删除最后一个元素。然后改回 \_ 并删除第一个和最后一个字符(将其处理为路径的方式的剩余部分)

break 行只是为了生成一些文件用于测试)