如何批量创建文件夹以移动同名的 .zip 文件和 .pdf 文件(减去扩展名)

如何批量创建文件夹以移动同名的 .zip 文件和 .pdf 文件(减去扩展名)

我有大约 1000 个 ESRI shapefile,每个都与我保存为 pdf 的书面报告相关联。

压缩文件和关联的 pdf 共享相同的文件名(减去扩展名)。

我希望能够批量创建\folder同名的文件并将.zip文件和移动.pdf\folder

我尝试了我找到的简短脚本这里

@echo off

for %%f in (*) do (
     md "%%~nf"
     move "%%f" "%%~nf"
   ) >nul 2>&1

但是它\folder\.zip文件创建了一个,为\.pdf文件创建了另一个。

任何帮助将不胜感激。

以下是我正在试验的文件的片段


名字相似,但它们是不是全部内容相同:


44LD0027_Ph1_TAA_08-00_SPEX_99-05_STPL_01-14.zip
                ↨                     ↨
44LD0027_Ph1_TAA 08-00_SPEX 99-05_STPL 01-14.pdf

  
44LD0109-44LD0371-44LD0421_Phl_TAA 01-01.pdf 
                                  
44LD0109-44LD0371-44LD0421_Phl_TAA_01-01.zip

答案1

[编辑]

从评论中可以看出,由于某些文件名中的空格不匹配,文件并不相同,因此它们需要更改为通用下划线,并且为了与 forfiles 的使用保持一致,前 2 个命令需要(来自https://stackoverflow.com/a/26940715/10802527

forfiles /m *.pdf /C "cmd /e:on /v:on /c set \"Phile=@file\" & if @ISDIR==FALSE ren @file !Phile: =_!"
forfiles /m *.zip /C "cmd /e:on /v:on /c set \"Phile=@file\" & if @ISDIR==FALSE ren @file !Phile: =_!"

在此处输入图片描述

然后

你可以尝试下面的代码,首先使用一个简单的命令来决定 zip 还是 pdf 更流行

echo PDF & dir *.pdf|find "File(s)"& echo ZIP &dir *.zip|find "File(s)"

然后是主程序将 .zip 替换为 .pdf,以较大者为准

forfiles /M *.zip /C "cmd /r if not exist @fname/*.@ext md @fname & move @fname.* @fname"

评论表明它会阻塞,但在我的测试中没有,移动 1000 + 1000 个文件名(移动是通过在硬盘 MFT 中重命名来完成的)在这个由 steam Win10x32 驱动的旧 50% CPU 上相当慢,所以从来没有想到会比缓慢而稳定更慢。但我发现 Powershell 要慢得多。全部 2000 个文件大约需要 2 到 8 分钟。

因此处理器消耗只是习惯性的,在 2-4 个线程之间切换。在这里我们看到它已经达到了测试文件对 173。 在此处输入图片描述

带有 OP 文件名的结果(加一) 在此处输入图片描述

警告
注意:当文件名接近 260 个字符时,Acrobat 很可能会出现问题包括路径名因此,如果文件名很长,请确保在靠近 C:\root 的文件夹中运行,并使用本地文件夹,而不是一个同步驱动器或用户桌面文件夹。如果文件在服务器上,则应在该环境中进行“移动”(扇区重命名),而不是从远处进行。

答案2

如果我假设正确,每个 ESRI 文件都在 zip 文件中,并有一个相应的 pdf 文件,对吗?

它检查每个 zip 文件,如果没有与 zip 同名的文件夹,它会首先创建一个文件夹,然后将 zip 和相应的 pdf 移动到该文件夹​​...

@echo off

for %%a in (*.zip) do (
                       IF NOT EXIST "%%~na" md "%%~na"
                       move "%%~na.zip" "%%~na"
                       move "%%~na.pdf" "%%~na"
                      )
exit

答案3

@echo off

cd /d "D:\The\Full\Path\To\Folder"

for %%i in =;( *.zip );= do set "_n=%%~ni" & 2>nul md .\"%%~ni" & 2>nul =;(
     %ComSpec% /v /q /s /c "call move /y "%%_n:_=?%%.*" .\"%%~ni" 1>nul ");=

1.输入你任务的目标文件夹,如果该文件夹和你要放bat的地方一样,那么就输入bat所在的文件夹:

:: Enter the target folder ::
cd /d "D:\The\Full\Path\To\Folder"

:: Or, enter the folder where the batch file is ::
cd /d "%~dp0"

2.使用循环.zip一次逐个列出文件:

for %%i in =;( *.zip );= do ... 

3.对于列出的每个内容,将您的( ).zip的名称保存在文件的变量中:.zip"%%~ni"

 for ... ( *.zip ) do set ".\%%~ni.pdf" & ... ( ... )

4.创建一个文件夹,以您的文件的名称命名.\zip,省略(2>nul)任何消息the folder already exists(考虑多次执行的情况以及执行期间出现名称重复的可能性):

if ... 2>nul md .\"%%~ni" ( 
                      ... ) 

5.使用子字符串扩展变量,用通配符替换名称_中的任何内容,这将适合名称中有空格和下划线的情况::.zip?

%ComSpec% ... "... move /y "%%_n:_=?%%.*"   ... "

6.调用一个新的命令解释器调用,该调用已经在运行时启用扩展延迟,以便在移动文件时使用子字符串执行命令:

%ComSpec% /v /q /s /c "call move /y "%%_n:_=?%%.*" .\"%%~ni" 1>nul "

其他资源:

相关内容