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
Windows 批处理文件移动特定文件_Windows_Batch File - Fatal编程技术网

Windows 批处理文件移动特定文件

Windows 批处理文件移动特定文件,windows,batch-file,Windows,Batch File,我有大量使用此模板的文件: example1.part001.rar example1.part002.rar example1.part003.rar ... example2.part001.rar example2.part002.rar example2.part003.rar ... 有时“part”后面只有两个数字 我正在尝试创建一个批处理文件,它首先生成名为“example n”的n个目录(n表示文件组的数量),然后将所有相关文件移到其中。 我会解释得更好 我有 cat.par

我有大量使用此模板的文件:

example1.part001.rar
example1.part002.rar
example1.part003.rar
...

example2.part001.rar
example2.part002.rar
example2.part003.rar
...
有时“part”后面只有两个数字

我正在尝试创建一个批处理文件,它首先生成名为“example n”的n个目录(n表示文件组的数量),然后将所有相关文件移到其中。 我会解释得更好

我有

cat.part01.rar
cat.part02.rar
cat.part03.rar
dog.part001.rar
dog.part002.rar
mouse.part01.rar
mouse.part02.rar
mouse.part03.rar
mouse.part04.rar
我想首先创建目录“cat”、“dog”和“mouse”,然后将所有相关文件移到其中(我的意思是“foldername”中的所有“foldername.part*.rar”),然后将“cat.part*.rar”文件移到“cat”文件夹中,以此类推。 文件很多,文件名非常不同,而且是随机的


有人能帮我吗?谢谢

在这里,我通过将文件名按“.”拆分得到一个组列表。然后我得到第一列的uniq值。对于每个结果,我创建目录。然后将所有文件移动到目录中

#/usr/bin/sh

groupnames=(`ls *.rar | awk -F"." '{print $1}' | uniq`)

for i in ${groupnames[*]}; do

  mkdir $i
  mv $i.*.rar ./$i/

done
编辑:

测试的示例文件:

球。第1部分。rar
ball.part2.rar

类别零件01.rar
cat.part02.rar

dog.part001.rar
dog.part002.rar

脚本创建文件夹ballcatdog,然后将文件移动到各自的文件夹中,并在文件名中使用partX、partXY和partXYZ

@echo off
@break off
@title Batch file move specific files
@color 0a
@cls

setlocal EnableDelayedExpansion

if "%~1" NEQ "" (
  set "WORKINGDIR=%~1"
) else (
  set "WORKINGDIR=!CD!"
)

if not exist "!WORKINGDIR!\*.rar" (
  set "WORKINGDIR=!CD!"
)

if not exist "!WORKINGDIR!\*.rar" (
  echo There are no winrar files in this directory
  echo.
  echo Exiting...
  echo.
  ping -n 4 localhost>nul
  pause
  exit
)

for %%a in ( "!WORKINGDIR!\*.rar" ) do (
  set "name=%%~nxa"
  if "!name:~-4!" EQU ".rar" (
    set "name=!name:~0,-4!"
  )
  if "!name:~-8,5!" EQU ".part" (
    echo !name:~-7! | find ".">nul
    if "!errorlevel!" NEQ "0" (
      set "name=!name:~0,-8!"
    ) else (
      set "skip=yes"
    )
  ) else if "!name:~-7,5!" EQU ".part" (
    echo !name:~-6! | find ".">nul
    if "!errorlevel!" NEQ "0" (
      set "name=!name:~0,-7!"
    ) else (
      set "skip=yes"
    )
  ) else if "!name:~-6,5!" EQU ".part" (
    echo !name:~-5! | find ".">nul
    if "!errorlevel!" NEQ "0" (
      set "name=!name:~0,-6!"
    ) else (
      set "skip=yes"
    )
  )
  if not defined skip (
    set "skip=no"
  )
  if "!skip!" EQU "no" (
    if not exist "!WORKINGDIR!\!name!\" (
      mkdir "!WORKINGDIR!\!name!\"
    )
    move /y "!WORKINGDIR!\%%~nxa" "!WORKINGDIR!\!name!\%%~nxa"
  )
  set "skip=no"
)

pause
exit

这也应该做到,并用
处理文件名也在其中

@echo off
for %%a in (*.rar) do (
 if exist "%%a" for %%b in ("%%~na") do (
    md "%%~nb" 2>nul
    move "%%~nb.part*.rar" "%%~nb" >nul
 )
)
pause

你应该创建一个脚本,询问你遇到的具体问题,而不是要求某人为你做全部工作……我向你保证我已经尝试过for,dir,但我找不到解决方案……太完美了!非常感谢。我只需要用“移动”代替“复制”。简单、整洁、简短,这就是我一直在寻找的解决方案!再次感谢你a你把问题作为答案,请哦,对不起,我发现了一个问题。。。许多文件都有“abc.def.ghi.part01.rar”这样的名称,所以不能使用分隔符“.”。。。我试着把“.part”作为分隔符,但它认为,.p,a,r,t是分开的,而不是单个单词。。。我怎样才能解决这个问题?谢谢,如果你能再多一级(aaa.bbb.ccc.rar),请看编辑。但是如果你能有(aaa.bbb.ccc.dddd.rar),那么它将不起作用。新编辑:现在你可以有“aaa.bbb.ccc.ddd.eee.rar”它将起作用。我想这是针对Linux的,我正在寻找Windows。。。无论如何谢谢你!很有效,谢谢!用户sachadee找到了一个较短的解决方案,但最终结果是相同的。也许你的代码有更多的东西,因为它是最长的?是的,没错。我编写了一个更大的代码,以避免可能出现的错误。我想象了某些带有点的文件名可能会出现的情况。在开始时,还有一部分用于处理目录作为参数,例如,您可以调用script.bat“Directory”作为script.bat的参数%1传递,但是如果您直接调用script.bat,它使用当前目录工作,因此您可以将脚本与文件一起放在文件夹中并运行良好,还可以检查WinRAR文件夹中是否有文件。我最大的原因是,通常在发布代码批处理脚本时,很少编程,所以要做必要的检查,只需使代码工作,我总是试图在代码中保持兼容性和更高的可靠性。就像我说的,这不是因为代码有效,你想说代码是正确的。良好的编程实践,即使在批处理脚本中也是可能的。
@echo off
@break off
@title Batch file move specific files
@color 0a
@cls

setlocal EnableDelayedExpansion

if "%~1" NEQ "" (
  set "WORKINGDIR=%~1"
) else (
  set "WORKINGDIR=!CD!"
)

if not exist "!WORKINGDIR!\*.rar" (
  set "WORKINGDIR=!CD!"
)

if not exist "!WORKINGDIR!\*.rar" (
  echo There are no winrar files in this directory
  echo.
  echo Exiting...
  echo.
  ping -n 4 localhost>nul
  pause
  exit
)

for %%a in ( "!WORKINGDIR!\*.rar" ) do (
  set "name=%%~nxa"
  if "!name:~-4!" EQU ".rar" (
    set "name=!name:~0,-4!"
  )
  if "!name:~-8,5!" EQU ".part" (
    echo !name:~-7! | find ".">nul
    if "!errorlevel!" NEQ "0" (
      set "name=!name:~0,-8!"
    ) else (
      set "skip=yes"
    )
  ) else if "!name:~-7,5!" EQU ".part" (
    echo !name:~-6! | find ".">nul
    if "!errorlevel!" NEQ "0" (
      set "name=!name:~0,-7!"
    ) else (
      set "skip=yes"
    )
  ) else if "!name:~-6,5!" EQU ".part" (
    echo !name:~-5! | find ".">nul
    if "!errorlevel!" NEQ "0" (
      set "name=!name:~0,-6!"
    ) else (
      set "skip=yes"
    )
  )
  if not defined skip (
    set "skip=no"
  )
  if "!skip!" EQU "no" (
    if not exist "!WORKINGDIR!\!name!\" (
      mkdir "!WORKINGDIR!\!name!\"
    )
    move /y "!WORKINGDIR!\%%~nxa" "!WORKINGDIR!\!name!\%%~nxa"
  )
  set "skip=no"
)

pause
exit
@echo off
for %%a in (*.rar) do (
 if exist "%%a" for %%b in ("%%~na") do (
    md "%%~nb" 2>nul
    move "%%~nb.part*.rar" "%%~nb" >nul
 )
)
pause