我希望创建一个Windows批处理脚本来移动大约2,000个文件并将它们拆分,以便每个文件夹有10个文件。我试图创建一个批处理脚本,但语法真的让我大吃一惊。这是我到目前为止所拥有的
@echo off
:: Config parameters
set /a groupsize = 10
:: initial counter, everytime counter is 1, we create new folder
set /a n = 1
:: folder counter
set /a nf = 1
for %%f in (*.txt) do (
:: if counter is 1, create new folder
if %n% == 1 (
md folder%nf%
set /a n += 1
)
:: move file into folder
mv -Y %%f folder%nf%\%%f
:: reset counter if larger than group size
if %n% == %groupsize% (
set /a n = 1
) else (
set /a n += 1
)
)
pause
这个脚本基本上是循环遍历目录中的每个.txt文件。它在开头创建一个新目录并将10个文件移动到该目录中,然后再次创建一个新文件夹并将另外10个文件移动到该目录中,依此类推。但是,我遇到问题,n
变量没有在循环中递增?我确定还有其他错误,因为即使使用pause
,CMD窗口也会关闭。感谢您的帮助或指导,感谢您的时间!
答案 0 :(得分:8)
您需要了解的一些事项:
SETLOCAL ENABLEDELAYEDEXPANSION
是必需的,因为您正在更改变量并在单个带括号的块中使用其更改的值。命令行上的SET /?
将提供一些信息。在互联网上搜索这个词,你会找到更好的解释。!nf!
格式的地方与延迟扩展有关。%nf%
。nf
初始化为0而不是1.这样,您要将文件移动到的文件夹编号与刚刚创建的文件夹编号相同。在您的代码中,您创建folderX,然后递增X,然后尝试将文件移动到X + 1。MOVE
移动文件,MV
无效。此批处理文件有效......但请确保您进行测试!我只测试了少量文件。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
:: Config parameters
SET groupsize=10
:: initial counter, everytime counter is 1, we create new folder
SET n=1
:: folder counter
SET nf=0
FOR %%f IN (*.txt) DO (
:: if counter is 1, create new folder
IF !n!==1 (
SET /A nf+=1
MD folder!nf!
)
:: move file into folder
MOVE /Y "%%f" folder!nf!
:: reset counter if larger than group size
IF !n!==!groupsize! (
SET n=1
) ELSE (
SET /A n+=1
)
)
ENDLOCAL
PAUSE
答案 1 :(得分:0)
您没有递增%nf%
。
答案 2 :(得分:0)
这是一个批处理文件(此处称为“ x.bat”),具有指向您要将文件放入其中的文件夹的链接:
mkdir "FilesToHere\1"
mkdir "FilesToHere\1\Example 1"
mkdir "FilesToHere\1\2"
mkdir "FilesToHere\1\2\Example2"
mkdir "FilesToHere\1\2\Example2\3"
mkdir "FilesToHere\1\2\Example2\4"
mkdir "FilesToHere\1\2\Example2\3\Example3"
mkdir "FilesToHere\1\2\Example2\3\Example 1"
mkdir "FilesToHere\1\2\Example2\3\Example4"
mkdir "FilesToHere\1\2\Example2\3\Example4\5"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5\6"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5\7"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5\7\Example 1"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5\7\Example6\1"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5\7\Example6\1\Example7"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5\7\Example7"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example 1"
mkdir "FilesToHere\1\2\Example2\3\Example8"
mkdir "FilesToHere\1\Example9"
2000个文件/ 20个文件夹= 100个文件/文件夹。 (您可以根据自己的文件/文件夹首选项更改以下数字。“ [...]”表示例如,列表中缺少16个列表项,表示为“ 1、2、3,[。 。] 20“。目录” s“有2,000个文件。” FilesToHere“位于” C:\ user \ Documents \ ex1 \ ex 2 \“。)您可以通过以下方式分发文件:
cd C:\user\Documents\FI\le\s
dir/b>../temp.txt
cd C:\user\Documents\FI\le\s
powershell -command "& {Get-Content ../temp.txt -TotalCount 100}" > ../temp1.bat
gvim -c "execute \"normal! 100dd\"" -c "wq" ../temp.txt
powershell -command "& {Get-Content ../temp.txt -TotalCount 100}" > ../temp2.bat
gvim -c "execute \"normal! 100dd\"" -c "wq" ../temp.txt
powershell -command "& {Get-Content ../temp.txt -TotalCount 100}" > ../temp3.bat
gvim -c "execute \"normal! 100dd\"" -c "wq" ../temp.txt
[...]
powershell -command "& {Get-Content ../temp.txt -TotalCount 100}" > ../temp20.bat
gvim -c "execute \"normal! 100dd\"" -c "wq" ../temp.txt
:%s/\\/\\\\/ge | %s/^mkdir "FilesToHere/gvim -c "%%s\/^\/move \\"\/g" -c "%%s\/$\/\\" \\"C:\\\\user\\\\Documents\\\\ex1\\\\ex 2\\\\FilesToHere/g | %s/"$/\\\\\\"\/g" -c "wq" ..\/temp```.bat/g | let i=1|g/```/s//\=i/|let i=i+1
cd C:\user\Documents\FI\le\s
gvim -c "%%s/^/move \"/g" -c "%%s/$/\" \"C:\\user\\Documents\\ex1\\ex 2\\FilesToHere\\1\\\"/g" -c "wq" ../temp1.bat
gvim -c "%%s/^/move \"/g" -c "%%s/$/\" \"C:\\user\\Documents\\ex1\\ex 2\\FilesToHere\\1\\Example 1\\\"/g" -c "wq" ../temp2.bat
gvim -c "%%s/^/move \"/g" -c "%%s/$/\" \"C:\\user\\Documents\\ex1\\ex 2\\FilesToHere\\1\\2\\\"/g" -c "wq" ../temp3.bat
[...]
gvim -c "%%s/^/move \"/g" -c "%%s/$/\" \"C:\\user\\Documents\\ex1\\ex 2\\FilesToHere\\1\\Example9\\\"/g" -c "wq" ../temp20.bat
cd C:\user\Documents\FI\le\s\
call ..\temp1.bat
[...]
call ..\temp19.bat
call ..\temp20.bat
注意:如果出现错误“'■t'未被识别为内部或外部命令,则
可运行程序或批处理文件。” (就像我在Windows 10上所做的那样),那么您必须将正在运行的任何批处理文件从Unicode转换为ANSI。 (另请参见https://www.wilderssecurity.com/threads/problem-executing-cmd-files.209442/)
如果您尝试将10,000个文件移动到100个文件夹(10,000 / 100 = 100个文件/文件夹)中,而100个文件夹以不均匀的方式散布(例如,100个文件夹),我发现此方法非常有用不在一个目录中,并且100个文件夹之间具有父子关系)。相关链接/文字: