Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何根据文件名将文件名排序到文件夹中_Batch File - Fatal编程技术网

Batch file 如何根据文件名将文件名排序到文件夹中

Batch file 如何根据文件名将文件名排序到文件夹中,batch-file,Batch File,我正在尝试根据文件名的开头将文件移动到文件夹中 例如,我有六个文件,xx_0_1.png,xx_0_2.png,xx_1_1.png,xxx_0_1.png,xxx_0_2.png,xxx_1_1.png (他们并不总是遵循三人一组的模式) 我需要它们根据_0之前的字符排序到文件夹中(因为可能有类似hello_world_0_1.png的东西,名称从不包含整数。后面的数字没有大小限制 所以如果我有fruit_0_1.png,fruit_0_2.png,fruit_1.png,fence_0_1.

我正在尝试根据文件名的开头将文件移动到文件夹中

例如,我有六个文件,xx_0_1.png,xx_0_2.png,xx_1_1.png,xxx_0_1.png,xxx_0_2.png,xxx_1_1.png

(他们并不总是遵循三人一组的模式)

我需要它们根据_0之前的字符排序到文件夹中(因为可能有类似hello_world_0_1.png的东西,名称从不包含整数。后面的数字没有大小限制

所以如果我有fruit_0_1.png,fruit_0_2.png,fruit_1.png,fence_0_1.png,fence_0_2.png,hello_world_0_1.png和hello_world_0_2.png,它们会像这样排序到文件夹中:

  • 水果0_1.png
  • 水果0_2.png
  • 水果1.png
篱笆

  • 围栏_0_1.png
  • 围栏0_2.png
你好,世界

  • 你好(世界)(0)(1.png)
  • 你好(world_0_2.png)
png文件名的格式始终为(sometext)(firstnumber)(secondnumber).png sometext可以包含下划线,但通常不包含数字。firstnumber和secondnumber的大小取决于它们最终的大小(通常小于20,但可以大于20) 并且文件的类型始终为.png

我尝试了其他堆栈溢出问题的一些解决方案,但是我还没有找到解决方案

我得到的最接近的结果是将每个文件分别排序到它们自己的文件夹中(这不是我想要的),我得到的示例如下:

@echo off
for %%a in (*.*) do (
md "%%~na" 2>nul
move "%%a" "%%~na"
)
cd ..
del %%~na
pause

它当前将每个文件放入各自的文件夹中,而不是在名称后拆分。

下面是一个示例脚本:

(“*.*.\u*..png”)中%%F的
@(集合“oF=%F”
SetLocal EnableDelayedExpansion
对于%%D In(“!oF:\!\…\”)Do@(设置“oD=%%~dpnD”
设置“oD=!oD:%\uuuuu CD%=!”
机器人复制。“!oD:\=\!”%%F”/Mov>NUL)
(本地)

由于您的问题只是一个代码请求,我不打算解释它是如何工作的,如何使用它,也不打算在发布时对您问题之外的任何场景进行扩展。

以下是一个可能的解决方案:

@echo关闭
setlocal EnableExtensions EnableDelayedExpansion
对于('2^>nul set“$ITEM[”)中的%%V,请设置“%%V=”
cd/D“C:\Projects”&rem/(在此处指定目标rooot目录)
对于/F“delims=”%%F in('
dir/B/A:-D-H-S“*.*.*.png”^ findstr/I/R“[^.].[0-9][0-9]*.[0-9][0-9]*\.png$”
""做"(
调用:子“%%~nF”
在(0,1,!IDX!)中为/L%%I设置/A“IDX-=2”&设置“NAME=”&设置“NAME=!NAME!!$ITEM[%I]!”
ECHO mkdir“%%~dpF!名称:~1,-1!”2>nul
回显移动“%%~fF”“%%~dpF!名称:~1,-1!\%%~nxF”
)
端部
退出/B
:SUB
set/A“IDX=0”&set“FILE=%~1”
设置“$ITEM[!IDX!]=%文件:”&set/A“IDX+=1”&set“$ITEM[!IDX!]=%
退出/B

在测试了正确的输出后,删除大写的
ECHO
命令

好的,我尝试了其他堆栈溢出帖子中的一些示例,但都没有成功,我得到的最接近的结果是将每个文件分别排序到它们自己的文件夹中(这不是我想要的),这个例子就是我的例子:
@echo off for%%a in(*.*)do(md“%%~na”2>nul move“%%a”“%%~na”)cd..del%%~na pause
它当前将每个文件放入各自的文件夹中,而不是在名称后拆分。请回答问题并将代码放在那里!除了代码很难在注释中读取之外,它们可能在将来的某个时候被清理掉,留下一个不完整的线程,因此请确保每个相关信息都被删除ecomes添加到帖子本身!