批处理文件-使用第一个文件名的第一部分通过命令行创建Zip文件

时间:2019-05-17 03:50:59

标签: batch-file 7zip

我有一个具有一致命名约定的PDF文件文件夹。我想为这些PDF文件创建一个zip文件,但使用@之前的文件部分命名该zip文件-所有文件的开头都相同(这是创建该文件的用户的NTID pdf文件)。

作为示例,这些是PDF输出文件夹中的文件的样子(@之前可能有100个文件都以相同的UserID开头。

UserID @ Carlos + Alberto + Mafra- + bribery-2019-05-16

UserID @ MAJELA + HOSPITALAR + LTDA- + bribery-2019-05-16

(理想情况下,我也希望将当前日期附加到zip文件中) 根据上面的示例,该压缩文件应名为UserID-2019-05-16.zip。

这是我尝试使用但没有成功的代码...

我为每个步骤使用其他建议创建了一个批处理脚本。但无法使其端到端地工作。

FOR %%F IN ("C:\Users\SA-JJC-HCC_Ops\OneDrive - JNJ\workflows\TPIGoogle\pdf\*.pdf") DO (
 set filename=%%F
 goto next
)
:next
echo "%filename%"

set zipfile=%filename%
for /f "tokens=1 delims=@" %%a in ("%zipfile%") do (

)
cd "C:\Program Files\7-Zip\"
7z.exe" a "C:\Users\SA-JJC-HCC_Ops\JNJ\HCC&P Alteryx - Documents\EPiC\GoogleSearches\zip\" && %zipfile% && ".zip" "C:\Users\SA-JJC-HCC_Ops\OneDrive - JNJ\workflows\TPIGoogle\pdf\*.pdf"

一个zip文件,其中所有PDF都使用PDF文件夹中文件名中的字符串的第一部分。

2 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL enabledelayedexpansion
SET "sourcedir=U:\sourcedir\t w o"
SET "destdir=U:\destdir"

FOR /f "tokens=1*delims=@" %%a IN (
 'dir /b /a-d "%sourcedir%\*@*-????-??-??.pdf" '
 ) DO (
 SET "pre=%%~a"
 SET "post=%%~nb"
 SET "post=!post:~-10!"
 IF DEFINED post ECHO "C:\Program Files\7-Zip\7z" a "%destdir%\!pre!-!post!.zip" "%sourcedir%\%%~a@%%~b"
 IF NOT DEFINED post ECHO SKIP "%%~a@%%~b"
)

GOTO :EOF

您需要根据自己的情况更改sourcedirdestdir的设置。

我使用了变量名prepost,以确保此过程中使用的名称不是像更合逻辑的date之类的关键字。

在源目录中读取与模式*@*-????-??-??.pdf匹配的所有文件名列表,并在@上标记。将用户ID分配给%%a,然后将其分配给pre,并将实际文件名的残渣的“名称”部分分配给post,然后仅选择post的最后10个字符使用延迟扩展。

如果需要的话,这里有机会进一步处理post,以检查它是否确实适合日期格式。该例程可能会返回post不受干扰或。如果不为空,则构造所需的7z命令(您可能希望添加-tzip)和echo进行验证-移除echo以启动{{1}压缩。如果7z 被模式检查例程清空,则文件名将被简单地报告为已被跳过。

答案 1 :(得分:0)

如果确实是当前日期,您想附加到zip文件的末尾,那么我们需要获取与语言环境无关的日期和时间。然后,这会将每个以UserID开头的pdf文件复制到一个带有运行脚本UserID-2019-05-17的日期的zip文件:

@echo off
set "outDir=C:\Users\SA-JJC-HCC_Ops\JNJ\HCC&P Alteryx - Documents\EPiC\GoogleSearches\zip\"
set "inDir=C:\Users\SA-JJC-HCC_Ops\OneDrive - JNJ\workflows\TPIGoogle\pdf\"
for /f "tokens=1,2 delims==" %%i in ('wmic os get LocalDateTime /VALUE') do (
    if ".%%i."==".LocalDateTime." set mydate=%%j
)
set mydate=%mydate:~0,4%-%mydate:~4,2%-%mydate:~6,2%

for %%a in (*.pdf) do for /f "delims=@" %%i in ('dir /b /a-d %%a') do (
    "C:\Program Files\7-Zip\7z" a "%outDir%%%i-%mydate%.zip" "%inDir%%%~a"
)

实际上,如果您想附加文件名的日期(换句话说,为每个文件创建带有不同日期以及匹配用户名的Zip文件):

@echo off
setlocal enabledelayedexpansion
set "outDir=C:\Users\SA-JJC-HCC_Ops\JNJ\HCC&P Alteryx - Documents\EPiC\GoogleSearches\zip\"
set "inDir=C:\Users\SA-JJC-HCC_Ops\OneDrive - JNJ\workflows\TPIGoogle\pdf\"
for %%a in (*.pdf) do for /f "tokens=1,* delims=@" %%i in ('dir /b /a-d %%a') do (
    set fdate=%%~nj
    set fdate=!fdate:~-10!
    echo "C:\Program Files\7-Zip\7z" a "%outDir%%%i-!fdate!.zip "%inDir%%%~a"
)