[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 请问怎么用批处理建立压缩文件

我的文件夹中有很多html文件,利用百度云盘同步总是识别出错导致无法同步,请问怎么全部给建立成压缩文件
1.html文件是分别在各个文件夹各个目录中的
2.能否用一个命令实现,把所有文件夹及子目录中的html与htm文件,全部单独建立成压缩包,还是存在相同的路劲,还是用相同的文件名
3.(另外文件创建日期,能否修改?能否就用当时html文件的日期?)

回复 1# o0star0o


    你电脑上是否安装了 7-Zip 或者 WinRAR ?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 smss 于 2020-5-24 21:03 编辑
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /ad') do (for /f "delims=" %%j in ('dir /b /s "%%i"') do "C:\Program Files\7-Zip\7z.exe" a "%%~dpnj.zip" "%%j")
  3. pause
复制代码
或者
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /ad') do (for /f "delims=" %%j in ('dir /b /s "%%i"') do "C:\Program Files\7-Zip\7z.exe" a "%%~nj.zip" "%%j")
  3. pause
复制代码

TOP

本帖最后由 WHY 于 2020-5-28 19:10 编辑

PowerShell脚本
  1. $srcDir = 'E:\Test\html';                                      #源文件夹路径
  2. $rar = 'C:\Program Files\WinRAR\WinRAR.exe';                   #WinRAR程序安装路径
  3. $ws  = New-Object -com 'WScript.Shell';
  4. dir $srcDir -Include *.html, *.htm -Recurse | ?{$_ -is [IO.FileInfo]} | forEach{
  5.     $dt1 = $_.CreationTime.ToString('yyyy-MM-dd HH:mm:ss');    #源文件创建日期
  6.     $dt2 = $_.LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss');   #源文件修改日期
  7.     $dt3 = $_.LastAccessTime.ToString('yyyy-MM-dd HH:mm:ss');  #源文件访问日期
  8.     $zipFile = $_.DirectoryName + '\' + $_.BaseName + '.zip';
  9.     $null = $ws.Run('"' + $rar + '" a -df -ep -afzip "' + $zipFile  + '" "' + $_.FullName + '"', 1, $true); #压缩
  10.     $item = get-Item -Literal $zipFile;
  11.     $item.CreationTime = $dt1;                                 #zip文件创建日期
  12.     $item.LastWriteTime = $dt2;                                #zip文件修改日期
  13.     $item.LastAccessTime = $dt3;                               #zip文件访问日期
  14. }
  15. echo 'Done';
  16. [Console]::ReadLine()
复制代码

TOP

本帖最后由 o0star0o 于 2020-5-25 20:42 编辑

回复 4# WHY


    $srcDir = 'E:\Test\html';                          #源文件夹路径
请问这样写,是会对E:\Test\整个目录以及子目录下的文件夹所有的html进行处理吗?还是只处理这一个?另外我是想对X目录下以及这个目录下的子目录中的所有html和htm文件进行建立压缩包,并要删除原htm文件,如果可以把rar的创建日修改为和htm的日期一样就完美了,因为文件都是按日期排序的

TOP

本帖最后由 o0star0o 于 2020-5-25 20:42 编辑

回复 3# smss


    谢谢回复,看您的代码还比较简洁,7zip我可以改成360zip吧,请问这个文件夹目录怎么改呢?这个是针对全盘的吗?
另外我是想对X目录下以及这个目录下的子目录中的所有html和htm文件进行建立压缩包,并要删除原htm文件,如果可以把rar的创建日修改为和htm的日期一样就完美了,因为文件都是按日期排序的

TOP

回复 2# Batcher


    您好Admin,装了360zip的,我也可以取下载安装,下面有两位朋友回复了代码,请您检阅

TOP

回复 5# o0star0o


    是对 E:\Test\html 文件夹及其子文件夹下面的 html、htm 文件执行压缩。
WinRAR命令有一个参数 -df,压缩后删除源文件,自己加上即可。

TOP

本帖最后由 WHY 于 2020-5-28 19:11 编辑

如果是 PowerShell v3.0 以上版本,可以这样:
  1. $srcDir = 'E:\Test\html';                                      #源文件夹路径
  2. dir $srcDir -Include *.html, *.htm -Recurse -File | forEach{
  3.     $dt1 = $_.CreationTime.ToString('yyyy-MM-dd HH:mm:ss');    #源文件创建日期
  4.     $dt2 = $_.LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss');   #源文件修改日期
  5.     $dt3 = $_.LastAccessTime.ToString('yyyy-MM-dd HH:mm:ss');  #源文件访问日期
  6.     $zipFile = $_.DirectoryName + '\' + $_.BaseName + '.zip';
  7.     Compress-Archive -Literal $_.FullName -Dest $zipFile | Out-Null; #压缩
  8.     del -Literal $_.FullName -Force;                           #删除源文件
  9.     $item = get-Item -Literal $zipFile;
  10.     $item.CreationTime = $dt1;                                 #zip文件创建日期
  11.     $item.LastWriteTime = $dt2;                                #zip文件修改日期
  12.     $item.LastAccessTime = $dt3;                               #zip文件访问日期
  13. }
  14. pause
复制代码

TOP

本帖最后由 WHY 于 2020-5-28 19:13 编辑

也可以用 Shell.Application 组件方法,但要分两个步骤,两个脚本
Test1.ps1
  1. $srcDir = 'E:\Test\html';                          #源文件夹路径
  2. $objShell = New-Object -Com 'Shell.Application';
  3. dir $srcDir -Include *.html, *.htm -Recurse | ?{$_ -is [IO.FileInfo]} | forEach{
  4.     $zipFile = $_.DirectoryName + '\' + $_.BaseName + '.zip';
  5.     [IO.File]::WriteAllText( $zipFile, 'PK' + [char]5 + [char]6 + (''+[char]0)*18 ); #写入zip头标记
  6.     $objItem  = $objShell.NameSpace($_.DirectoryName).ParseName($_.Name);
  7.     $objShell.NameSpace($zipFile).CopyHere($objItem);   #压缩         
  8. }
  9. echo 'Done';
  10. [Console]::ReadLine()
复制代码
Test2.ps1
  1. $srcDir = 'E:\Test\html';                                      #源文件夹路径
  2. dir $srcDir -Include *.html, *.htm -Recurse | ?{$_ -is [IO.FileInfo]} | forEach{
  3.     $zipFile = $_.DirectoryName + '\' + $_.BaseName + '.zip';
  4.     if( ![IO.File]::Exists($zipFile) ){ continue;}
  5.     $dt1 = $_.CreationTime.ToString('yyyy-MM-dd HH:mm:ss');    #源文件创建日期
  6.     $dt2 = $_.LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss');   #源文件修改日期
  7.     $dt3 = $_.LastAccessTime.ToString('yyyy-MM-dd HH:mm:ss');  #源文件访问日期
  8.     del -Literal $_.FullName -Force;     #删除
  9.     $item = get-Item -Literal $zipFile;
  10.     $item.CreationTime = $dt1;                                 #zip文件创建日期
  11.     $item.LastWriteTime = $dt2;                                #zip文件修改日期
  12.     $item.LastAccessTime = $dt3;                               #zip文件访问日期
  13. }
  14. echo 'Done';
  15. [Console]::ReadLine()
复制代码

TOP

回复 9# WHY


    谢谢回复,经测算,可以运行,能建立并删除html文件,第二个用2个步骤的日期修改的是“创建文件”的日期,需要把“创建文件”和 “修改文件”的日期,都同时修改为html文件的创建日期,这样就能正确的按日期排序了,麻烦您帮我修改下吧,谢谢!(另外第一个单独的代码还是比较好,运行一个就行了,但是那个代码改不了日期)

TOP

你把创建时间、修改时间搞反了吧?
Windows资源管理器按时间排序是以“修改日期”排序的,而不是“创建日期”
另外第一个单独的代码还是比较好,运行一个就行了,但是那个代码改不了日期

你应该右击zip文件,在属性中查看创建日期是否修改。

TOP

脚本已修改,把 zip 压缩文件的三个日期改成与 html 一致。

TOP

本帖最后由 o0star0o 于 2020-5-29 00:00 编辑

回复 13# WHY


你好,我测试了下,在单独存个文件夹可以运行,我需要处理的文件夹不能运行呢,E:\Test\html文件夹路径不能为中文吗?提示的是路径不存在,但是路径是正确的,我直接复制的。那个文件夹路径比较深,不好改,能否支持下中文路径呢?您可以测试下,我单独放个中文名字的文件夹就运行不了

TOP

本帖最后由 WHY 于 2020-5-29 10:59 编辑

回复 14# o0star0o


    猜测你脚本保存的是 UTF-8 without BOM 编码格式。
如果没有特殊需要,直接保存为 ansi 编码即可。

脚本用记事本打开,文件——另存为——选择编码 ansi

TOP

返回列表