我有大约 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。
警告
注意:当文件名接近 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 "
其他资源: