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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
File 批量创建相同文件名的文件夹_File_Batch File_Directory - Fatal编程技术网

File 批量创建相同文件名的文件夹

File 批量创建相同文件名的文件夹,file,batch-file,directory,File,Batch File,Directory,我正在使用这段代码创建文件夹并统一同名文件,结果发现一些文件可以工作,就像3D Pool一样,但其他文件的情况(磁盘1/2),(磁盘2/2)不工作,可能会有帮助吗 @echo off setlocal set "basename=." for /F "tokens=1* delims=." %%a in ('dir /B /A-D ^| sort /R') do ( set "filename=%%a" setlocal EnableDelayedExpansion for

我正在使用这段代码创建文件夹并统一同名文件,结果发现一些文件可以工作,就像3D Pool一样,但其他文件的情况(磁盘1/2),(磁盘2/2)不工作,可能会有帮助吗

@echo off
setlocal

set "basename=."
for /F "tokens=1* delims=." %%a in ('dir /B /A-D ^| sort /R') do (
   set "filename=%%a"
   setlocal EnableDelayedExpansion
   for /F "delims=" %%c in ("!basename!") do if "!filename:%%c=!" equ "!filename!" (
      set "basename=!filename!"
      md "!basename!"
   )
   move "!filename!.%%b" "!basename!"
   for /F "delims=" %%c in ("!basename!") do (
      endlocal
      set "basename=%%c
   )
)
包含文件的My struture文件夹:

3D Pool (1989)(Firebird Software)(Disk 1 of 2).dsk
3D Pool (1989)(Firebird Software)(Disk 2 of 2).dsk
3D Pool (1989)(Firebird Software).dsk
3D Pool (1989)(Firebird Software)[cr Steel McKraken - Exocet].dsk
5th Axis, The (1985)(Loriciels)(fr).dsk
5th Axis, The (1985)(Loriciels)(fr)[a].dsk
5th Axis, The (1985)(Loriciels).dsk
Zolyx (1988)(Firebird Software).dsk
Zolyx (1988)(Firebird Software)[t].dsk
Zombi (1990)(Ubisoft)(fr)(Disk 1 of 2).dsk
Zombi (1990)(Ubisoft)(fr)(Disk 1 of 2)[6128 Version].dsk
Zombi (1990)(Ubisoft)(fr)(Disk 2 of 2).dsk
Zombi (1990)(Ubisoft)(fr)(Disk 2 of 2)[6128 Version].dsk
Zombi (1990)(Ubisoft)(fr)[464 Version].dsk
使用批处理时,它会创建文件夹并将文件放在其中:

3D Pool (1989)(Firebird Software)
3D Pool (1989)(Firebird Software)[cr Steel McKraken - Exocet]
5th Axis, The (1985)(Loriciels)
Zolyx (1988)(Firebird Software)
Zolyx (1988)(Firebird Software)[t]
Zombi (1990)(Ubisoft)(fr)(Disk 1 of 2)
Zombi (1990)(Ubisoft)(fr)(Disk 1 of 2)[6128 Version]
Zombi (1990)(Ubisoft)(fr)(Disk 2 of 2)
Zombi (1990)(Ubisoft)(fr)(Disk 2 of 2)[6128 Version]
Zombi (1990)(Ubisoft)(fr)[464 Version]
我希望批处理按名称将文件放入文件夹中,使其尽可能干净:

3D Pool (1989)(Firebird Software)
   3D Pool (1989)(Firebird Software)(Disk 1 of 2).dsk
   3D Pool (1989)(Firebird Software)(Disk 2 of 2).dsk
   3D Pool (1989)(Firebird Software).dsk
   3D Pool (1989)(Firebird Software)[cr Steel McKraken - Exocet].dsk
5th Axis, The (1985)(Loriciels)
   5th Axis, The (1985)(Loriciels)(fr).dsk
   5th Axis, The (1985)(Loriciels)(fr)[a].dsk
   5th Axis, The (1985)(Loriciels).dsk
Zolyx (1988)(Firebird Software)
   Zolyx (1988)(Firebird Software).dsk
   Zolyx (1988)(Firebird Software)[t].dsk
Zombi (1990)(Ubisoft)(fr)
   Zombi (1990)(Ubisoft)(fr)(Disk 1 of 2).dsk
   Zombi (1990)(Ubisoft)(fr)(Disk 1 of 2)[6128 Version].dsk
   Zombi (1990)(Ubisoft)(fr)(Disk 2 of 2).dsk
   Zombi (1990)(Ubisoft)(fr)(Disk 2 of 2)[6128 Version].dsk
   Zombi (1990)(Ubisoft)(fr)[464 Version].dsk

是否可以执行此操作?

此目录创建和文件移动任务可以使用以下批处理代码完成:

@echo off
if "%~1" == "" (pushd "%~dp0") else (
    pushd "%~1"
    if errorlevel 1 (
        echo ERROR: Directory "%~1" does not exist.
        echo/
        pause
        exit
    )
)

setlocal EnableExtensions DisableDelayedExpansion
set "FolderName=\"

for /F "eol=| delims=" %%I in ('dir /A-D /B /O-N 2^>nul') do if not "%%~fI" == "%~f0" (
    for /F "eol=| tokens=1 delims=[]" %%J in ("%%~nI") do (
        set "FileName=%%J"
        set "FullName=%%I"
        setlocal EnableDelayedExpansion
        set "DiskAddon=!FileName:*(Disk =(Disk !"
        if not "!DiskAddon!" == "!FileName!" for /F "delims=" %%V in ("!DiskAddon!") do set "FileName=!FileName:%%V=!"
        for /F "eol=| delims=" %%K in ("!FolderName!") do (
            if "!FileName:%%K=!" == "!FileName!" (
                md "!FileName!" 2>nul
                move /Y "!FullName!" "!FileName!\"
                for /F "eol=| delims=" %%V in ("!FileName!") do (
                    endlocal
                    set "FolderName=%%V"
                )
            ) else (
                move /Y "!FullName!" "!FolderName!\"
                endlocal
            )
        )
    )
)

endlocal
popd
批处理文件可以与要处理的文件一起存储在目录中,也可以与要处理的目录的路径一起调用。批处理文件目录或指定的目录临时设置为当前目录

环境变量
FolderName
根据文件名存储上次创建的文件夹名。环境变量
FolderName
使用无效名称
\
定义,以便始终在第一个文件上最内部的IF条件的true分支中运行

的第一个在后台运行另一个命令进程,该进程以
%ComSpec%/c
开始,并且
'
之间的命令行作为附加参数附加。当Windows安装到
C:\Windows
中时,将执行以下操作:

C:\Windows\System32\cmd.exe /c dir /A-D /B /O-N 2>nul
由已启动的后台命令进程执行的命令DIR输出,以处理后台命令进程的STDOUT(标准输出)

  • 仅显示文件名,因为选项
    /A-D
    (属性不是目录)
  • 以裸格式,这意味着只有文件名和文件扩展名,但没有文件路径,因为选项
    /B
  • 由于
    /O-N
  • 当前目录中与默认通配符模式匹配的所有文件的
在这里,需要以相反的顺序首先输出较短的文件名,分别是输出
[…]
的文件名,然后是输出
(磁盘x/y)
的文件名

可能根本找不到任何文件。在这种情况下,DIR将输出一条错误消息,以处理STDERR(标准错误)。通过将此不重要的错误消息重定向到设备NUL来抑制此错误消息。FOR循环对指定目录中未找到的文件不执行任何操作

阅读Microsoft关于的文章,了解有关
2>nul
的解释。当Windows命令解释器在执行
FOR的命令之前处理此命令行时,重定向操作符必须在上用插入符号^转义,以便命令行被解释为文字字符,该命令行以单独的方式执行嵌入的dir命令行命令进程在后台启动

FOR使用所用的选项
/F
和包含在
中的命令行
捕获所有输出,以处理已启动的后台命令进程的STDOUT,并在启动后逐行处理该输出
cmd.exe
在完成命令执行后自行终止线路

默认情况下,会忽略此处不出现的的空行

默认情况下,FOR将使用普通空格和水平制表符作为字符串分隔符将每行拆分为子字符串,并将仅第一个空格/制表符分隔的子字符串分配给指定的循环变量
I
。这里不需要这种行分割行为,因为文件名可以包含一个或多个空格。因此,使用选项
delims=
定义一个空的分隔符列表,以完全禁用行拆分行为

FOR也会忽略行拆分后第一个子字符串是分号的行,分号是默认的行尾字符。文件名可以以分号开头。因此,
eol=|
将行尾字符重新定义为一个垂直条,该垂直条的名称中不能包含任何文件名

因此,每个具有文件扩展名的文件名都被一个接一个地完全分配给循环变量
I
,以便进一步处理

处理文件名时,当前由
cmd.exe
处理的批处理文件将被忽略,因为命令行的第一个上的条件

下一个FOR只处理文件名,而不将文件扩展名作为字符串。选项
eol=| tokens=1 delims=[]
用于将文件名拆分为子字符串,使用方括号作为分隔符,仅将第一个子字符串分配给指定的循环变量
J
,而不忽略以
开头的文件名。这对于像
3D-Pool(1989)(Firebird软件)[cr Steel McCraken-Exocet].dsk
just
3D-Pool(1989)(Firebird软件)
这样的文件名是必要的,它被分配给循环变量
J
,以便进一步处理

说明在使用命令块执行命令之前,Windows命令处理器将以
开始,以匹配
结束的命令块中的所有
%variable%
替换为环境变量的当前值。这意味着必须在循环上方启用,否则每个
也将被解释为环境变量引用的开始/结束,并在执行时延迟扩展。因此,在循环内启用和禁用延迟扩展。
有关命令SETLOCALENDLOCAL的详细信息,请阅读

环境变量
DiskAddon
定义如下:
@echo off
if "%~1" == "" (pushd "%~dp0") else (
    pushd "%~1"
    if errorlevel 1 (
        echo ERROR: Directory "%~1" does not exist.
        echo/
        pause
        exit
    )
)

setlocal EnableExtensions DisableDelayedExpansion
set "FolderName=\"
for /F "eol=| delims=" %%I in ('dir /A-D /B /O-N 2^>nul') do if not "%%~fI" == "%~f0" call :ProcessFile "%%I"
goto EndBatch

:ProcessFile
for /F "eol=| tokens=1 delims=[]" %%J in ("%~n1") do set "FileName=%%J"
setlocal EnableDelayedExpansion
set "DiskAddon=!FileName:*(Disk =(Disk !"
if not "!DiskAddon!" == "!FileName!" set "FileName=!FileName:%DiskAddon%=!"
if not "!FileName:%FolderName%=!" == "!FileName!" endlocal & goto MoveFile
endlocal & set "FolderName=%FileName%"
md "%FolderName%" 2>nul
:MoveFile
move /Y %1 "%FolderName%\"
goto :EOF

:EndBatch
endlocal
popd
20000 Lieus sous les Mers (1988)(Coktel Vision)(fr)(Disk 1 of 2).dsk
20000 Lieus sous les Mers (1988)(Coktel Vision)(fr)(Disk 2 of 2).dsk
20000 Lieus sous les Mers (1988)(Coktel Vision)(fr)(Disk 1 of 2)
20000 Lieus sous les Mers (1988)(Coktel Vision)(fr)(Disk 2 of 2)
3 Guerra Mundial (1989)(Pactum)(es)(Disk 1 of 2)
3 Guerra Mundial (1989)(Pactum)(es)(Disk 2 of 2)
A la Conquete de l'Orthographe (1991)(Generation 5)(fr)(Disk 1 of 2)
A la Conquete de l'Orthographe (1991)(Generation 5)(fr)(Disk 2 of 2)
A la Pursuite de Carmen Sandiego dans le Monde (1990)(Broderbund Software)(fr)(Disk 1 of 2)
A la Pursuite de Carmen Sandiego dans le Monde (1990)(Broderbund Software)(fr)(Disk 2 of 2)
Zap 't' Balls - The Advanced Edition (1992)(Elmsoft Game-Service)(Disk 1 of 2)
Zap 't' Balls - The Advanced Edition (1992)(Elmsoft Game-Service)(Disk 2 of 2)
@echo off

for %%A in (*.dsk) do (
    for /f "tokens=1-3 delims=()" %%B in ("%%~A") do (
        if not exist "%%~B(%%~C)(%%~D)" md "%%~B(%%~C)(%%~D)"
        move /y "%%~A" "%%~B(%%~C)(%%~D)\" >nul
    )
)