标题: [文件操作] BAT如何批量压缩文件夹的文件包括子目录下的文件? [打印本页]
作者: netdzb 时间: 2019-6-17 11:20 标题: BAT如何批量压缩文件夹的文件包括子目录下的文件?
把文件压缩到一个到临时一个文件,当临时文件体积大于20mb的时候,
要求删除要求删除压缩包里面最后一个文件,使其体积不大于20mb,
然后保存到001.zip或001.rar。然后把临时压缩包体积重置0,继续打包
后面的文件,当体积大于20mb的时候,也删掉临时压缩包的最后一个文件。
然后把临时文件改为002.zip或rar。不知道表达的清楚吗?
作者: Batcher 时间: 2019-6-17 11:36
7-Zip或者WinRAR自带的【分卷压缩】功能无法满足需求是吗?
作者: netdzb 时间: 2019-6-17 11:54
本帖最后由 netdzb 于 2019-6-17 11:56 编辑
回复 2# Batcher
分卷压缩是不能单独解压,要求能够单独解压。
代码我能写一点,
就是打包的时候,绝对路径怎么写,我不知道怎么写?
作者: Batcher 时间: 2019-6-17 12:39
回复 3# netdzb
把你写的代码发出来,我看看怎么加上路径。
作者: netdzb 时间: 2019-6-17 12:49
本帖最后由 netdzb 于 2019-6-17 12:50 编辑
回复 4# Batcher
@echo on
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /a-d /b *.*') do (
set n=001
rar a temp.rar %%i
if temp.rar的大小,小于等于20mb
copy temp.rar !n!.rar
else
(
del temp.rar
n=n+1
)
)
temp.rar的大小用什么变量表示,写了一部分,帮忙修改一下,谢谢。
作者: Batcher 时间: 2019-6-17 13:17
回复 5# netdzb
temp.rar的大小你试试 %%~zi
作者: netdzb 时间: 2019-6-17 14:04
回复 6# Batcher
temp.rar是常量, %%~zi是变量,
如何判断temp.rar小于20MB的代码呢?常量的写法我不会啊。
作者: xczxczxcz 时间: 2019-6-17 15:04
确保你的系统能正常使用 POWERSHELL ,否则PASS, 下面的脚本用 WINRAR 安装目录下的 RAR.EXE 非 WINRAR.EXE。偶已集成 RAR.EXE 到系统环境变量中,所以直接使用。至于 winrar.exe 和 rar.exe 是否有相同的用法和效果。未知。
确保 使用工作路径 切换到 你要操作的文件夹。- $files =ls |?{$_.Directory};
-
- $Begin, $n =0,1;
- While ( $Begin -lt $files.Count )
- {
- $name =$n.ToString().PadLeft(3,'0')+'.rar';
- & rar a -ep $name $files[$Begin].FullName|Out-Null;
- if ((Get-Item $name).Length/1MB -gt 20) {
- & rar d -ep $name $files[$Begin].Name|Out-Null;
- $n++;
- } else { $Begin++ }
- }
复制代码
作者: netdzb 时间: 2019-6-17 15:34
回复 8# xczxczxcz
我装的是powershell V2版本,代码无法通过。
作者: xczxczxcz 时间: 2019-6-17 15:37
回复 9# netdzb
哪一句? 偶测了下,一路OK。
作者: netdzb 时间: 2019-6-17 16:46
回复 10# xczxczxcz
powershell -file 脚本.ps1
是这样运行吗?
刚弄了个Hello,World可以运行,
Write-Host "Hello World!"
Write-Host "lk"
把上面保存到脚本里面,powershell -file 脚本.ps1还是报错,不知道哪里不对?
作者: netdzb 时间: 2019-6-17 16:50
回复 10# xczxczxcz
哪里有好用的powershell,手上的版本好像被微软禁用了。
作者: netdzb 时间: 2019-6-17 16:53
回复 8# xczxczxcz
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\WINDOWS\system32>d:
D:\>cd \power
D:\power>powershell hello.ps1
The term 'hello.ps1' is not recognized as a cmdlet, function, operable program,
or script file. Verify the term and try again.
At line:1 char:10
+ hello.ps1 <<<<
D:\power>
我报上面的错误。
作者: xczxczxcz 时间: 2019-6-17 16:57
回复 12# netdzb
管理员运行 POWERSHELL 命令行窗口。
输入: set-executionpolicy RemoteSigned
回车,再输入 'A' 再回车。
输入: CD "你的文件夹目录完整路径" 回车。
粘贴上面的脚本内容,回车,会在目录下生成 001.ra;002.rar;....
如果你的 RAR 不能随意调用。则要把上面脚本中的 rar 写上完整路径。如: "C:\XXXX\XXX\WINRAR\RAR.EXE"
不需要 BAT 调用.
作者: xczxczxcz 时间: 2019-6-17 16:58
回复 13# netdzb
是 POWERSHELL 窗口 不是DOS 窗口
作者: xczxczxcz 时间: 2019-6-17 17:03
回复 xczxczxcz
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
...
netdzb 发表于 2019-6-17 16:53
holleo.ps1 前面加个 ".\"; powershell .\hello.ps1; 介样子。或 powershell "d:\xxx\hello.ps1"
作者: netdzb 时间: 2019-6-17 17:09
回复 15# xczxczxcz
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\WINDOWS\system32>i:
I:\>cd hetxt
I:\hetxt>path d:\power
I:\hetxt>powershell
Windows PowerShell V2 (Community Technology Preview - Features Subject to Change
)
Copyright (C) 2007 Microsoft Corporation. All rights reserved.
PS I:\hetxt> ./yan.ps1
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
The term 'rar' is not recognized as a cmdlet, function, operable program, or sc
ript file. Verify the term and try again.
At I:\hetxt\yan.ps1:7 char:3
+ & <<<< rar a -ep $name $files[$Begin].FullName|Out-Null;
Get-Item : Cannot find path 'I:\hetxt\001.rar' because it does not exist.
At I:\hetxt\yan.ps1:8 char:15
+ if ((Get-Item <<<< $name).Length/1MB -gt 20) {
PS I:\hetxt>
可以运行了,但是遇到rar找不到的问题,怎么解决?
控制台我能运行rar,环境变量我已经设置了啊。
作者: netdzb 时间: 2019-6-17 17:18
回复 15# xczxczxcz
代码运行了,结果不正确。文件夹下面的文件被压缩了。下面的子文件夹没有被打包。如果子文件下面还有子
文件夹还要继续被打包。
作者: netdzb 时间: 2019-6-17 17:21
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\WINDOWS\system32>i:
I:\>cd \hetxt
I:\hetxt>path d:\power
I:\hetxt>powershell
Windows PowerShell V2 (Community Technology Preview - Features Subject to Change
)
Copyright (C) 2007 Microsoft Corporation. All rights reserved.
PS I:\hetxt> ./yan.ps1
PS I:\hetxt> ls
Directory: Microsoft.PowerShell.Core\FileSystem::I:\hetxt
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2019-6-17 13:54 yhgf
-a--- 2019-6-1 12:50 133 hebing.bat
-a--- 2019-6-2 11:30 117 hel.sh
-a--- 2019-6-2 11:36 116 hel.sh.txt
-a--- 2019-6-17 16:32 47 hello.ps1
-a--- 2019-6-1 12:33 145 shiyan.bat
-a--- 2019-6-17 16:21 254 test.bat
-a--- 2019-6-2 11:31 100 total.txt
-a--- 2019-6-17 17:12 341 yan.ps1
-a--- 2019-6-1 11:58 8 密码01.txt
-a--- 2019-6-1 11:58 8 密码02.txt
-a--- 2019-6-1 11:58 10 密码03.txt
-a--- 2019-6-1 11:58 11 密码04.txt
-a--- 2019-6-1 11:59 10 密码05.txt
-a--- 2019-6-1 11:59 12 密码06.txt
-a--- 2019-6-1 11:59 11 密码07.txt
-a--- 2019-6-1 11:59 14 密码08.txt
文件被打包了,文件夹yhgf没有被打包。
作者: xczxczxcz 时间: 2019-6-17 17:22
本帖最后由 xczxczxcz 于 2019-6-17 17:24 编辑
把 XXX.PS1 放到你要处理的文件夹内。再把控制台切换到该目录。再运行。
偶看你自己写的BAT 也是在待处理文件夹内,所以也这样写了。
不过这样的话会把 xxx.ps1也打包进去。
其实你 在切换到该目录下后,直接把上面的 脚本内容 复制粘贴 到控制台运行 就可以了。
作者: xczxczxcz 时间: 2019-6-17 17:25
回复 19# netdzb
偶看你上面的 BAT 只处理 文件 没有处理文件夹。所以你懂的。过滤了文件夹。
作者: netdzb 时间: 2019-6-17 17:28
回复 21# xczxczxcz
@echo on
setlocal enabledelayedexpansion
set num=100
for /f "delims=" %%i in ('dir /a-d /b /s *.*') do (
rar a i:\hand\temp.rar %%i
copy/y i:\hand\temp.rar i:\hand\!num:~-2!.rar
set /a num+=1
del i:\hand\temp.rar
)
pause
代码我修改了,文件大小的判断我搞不定。能否增加文件夹判断的功能,谢谢!
作者: xczxczxcz 时间: 2019-6-17 17:38
回复 22# netdzb
把 PS 脚本的第一行改成 $files =ls -rec|?{$_.Directory};
其它不变,看能不能满足你的要求。如果要保存原来文件的目录结构,自行删除 -EP 参数。
作者: netdzb 时间: 2019-6-17 17:48
回复 23# xczxczxcz
测试了,还是没有文件夹。
作者: xczxczxcz 时间: 2019-6-17 18:03
回复 24# netdzb
是把文件夹内的文件一起提出来了,不建立文件夹。
作者: netdzb 时间: 2019-6-17 18:14
回复 25# xczxczxcz
把ep去掉就文件夹了。
作者: xczxczxcz 时间: 2019-6-17 18:16
你自己根据需要 修改 RAR 参数吧。偶们也不明白你的最终需求。
作者: Batcher 时间: 2019-6-17 19:03
回复 22# netdzb
试试这样可以比较文件大小吗:- @echo on
- setlocal enabledelayedexpansion
- set num=100
- for /f "delims=" %%i in ('dir /a-d /b /s *.*') do (
- rar a I:\hand\temp.rar "%%i"
- for %%a in ("I:\hand\temp.rar") do (
- if %%~za leq 20971520 (
- echo %%a 不大于20MB
- REM 把你需要的操作放在这里
- )
- )
- copy /y I:\hand\temp.rar I:\hand\!num:~-2!.rar
- set /a num+=1
- del /f I:\hand\temp.rar
- )
- pause
复制代码
作者: netdzb 时间: 2019-6-18 11:27
回复 28# Batcher
代码有错误,会在页面显示代码,好像是多了括号。
作者: Batcher 时间: 2019-6-18 15:07
回复 29# netdzb
echo on 改成 echo off 试试呢?如果还是不行,请把报错信息发出来看看。我数了一下,5个左括号、5个右括号,没发现多或少。
作者: netdzb 时间: 2019-6-19 16:53
回复 8# xczxczxcz
我把代码改成这样,你看可以吗?
$files =ls |?{$_.Directory};
$Begin, $n =0,1,$Len=0;
While ( $Begin -lt $files.Count )
{
$name =$n.ToString().PadLeft(3,'0')+'.rar';
While ( $Len -lt 19.5MB)
{
Len=Len+Get-Item $name).Length;
& rar
}
Len=0;
}
作者: xczxczxcz 时间: 2019-6-19 17:17
本帖最后由 xczxczxcz 于 2019-6-19 17:22 编辑
回复 31# netdzb
一、肯定不能运行。
二、不会处理子目录。
再给你写个 带子目录的。用法同前。若嫌目录太长,可把工作文件夹放到磁盘根目录。这样简单,不需要过多处理。
下面的脚本不处理:当有一个文件大于设定值时,会无限循环。所以假设你的每一个文件都不会超过设定的值。- $files =ls -rec |?{$_.Directory};
- $Size = 19.5; #自定义大小,
- $index, $n =0,1;
- While ( $index -lt $files.Count )
- {
- $name =$n.ToString().PadLeft(3,'0')+'.rar';
- & rar a $name $files[$index].FullName|Out-Null;
- if ((Get-Item $name).Length/1MB -gt $Size) {
- $del =$files[$index].FullName -replace '^\w:\\';
- & rar d $name $del | Out-Null;
- $n++;
- } else { $index++ }
- }
复制代码
作者: smss 时间: 2019-6-19 21:26
本帖最后由 smss 于 2019-6-19 21:36 编辑
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /a-d /b *.*') do (set n=001
- rar a temp.rar %%i
- for %%i in (temp.rar) do (
- if %%~zi leq 20971520 (copy temp.rar !n!.rar) else (del temp.rar
- n=n+1
- ))
- pause
复制代码
rar 为你电脑RAR绝对路径
作者: netdzb 时间: 2019-6-22 15:47
回复 32# xczxczxcz
一个一个包压缩效率太低,打包405个文件用了一个小时。能否改成在门限下的尺寸,得到一个输出列表。
然后通过列表文件进行打包。
作者: xczxczxcz 时间: 2019-6-24 20:39
回复 34# netdzb
偶测试了 1080个文件(主目录540个,子目录也540个,每个文件为1.89M),按每个压缩包不大于20M的最大文件,默认压缩率,处理用时 147秒。又测试按每个压缩包 100个文件的方式打包,采用极限压缩。用时48秒。不知道你的 1 个小时怎么来的。
作者: netdzb 时间: 2019-6-24 21:00
回复 35# xczxczxcz
可能我是机械硬盘的关系,或者我的cpu太慢。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |