Board logo

标题: [文件操作] 批处理如何实现比对 备份 查重 清理? [打印本页]

作者: jave000    时间: 2022-1-14 15:15     标题: 批处理如何实现比对 备份 查重 清理?

我在论坛搜了比对代码,和我需求不同。求助以下。folderA和folderB的实际文件夹名一样,只是路径不同。
将要备份的存于网盘的folderA文件夹包括内部所有子文件夹及其文件,备份到存于本机的folderB。完成后对folderB进行全目录重名文件查找,并自动删除旧的,或者提示出来让我手删。(因为可能部分文件移动了位置)
xcopy和robocopy我会,但是比对查重清理不会。
作者: jave000    时间: 2022-1-18 16:26

或者能有一个指定目录下包括子文件夹的所有文件查重也行……我有这个绿色工具,但我不能在工作电脑上运行第三方exe……
作者: idwma    时间: 2022-1-18 17:15

本帖最后由 idwma 于 2022-1-19 14:25 编辑
  1. #@&cls&powershell "type %~s0|out-string|iex"&pause&exit
  2. $fa='.\fa'
  3. $fb='.\fb'
  4. copy -rec $fa $fb
  5. $a=@{}
  6. dir -rec $fb -include *.*|?{!$_.PSIsContainer}|%{
  7. if(!$a.ContainsKey($_.name)){$a+=@{$_.name=$_}}elseif($a[$_.name].LastWriteTime -gt $_.LastWriteTime){del $_.fullname}elseif($a[$_.name].LastWriteTime -lt $_.LastWriteTime){del $a[$_.name].fullname;$a[$_.name]=$_}
  8. }
复制代码

作者: flashercs    时间: 2022-1-18 17:38

  1. <#*,:&cls
  2. @echo off
  3. cd /d "%~dp0"
  4. powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
  5. pause
  6. exit /b
  7. #>
  8. # 功能:文件查重,删除旧文件
  9. $folder = "." # 指定文件夹
  10. Get-ChildItem -LiteralPath $folder -Recurse | Where-Object { -not $_.PSIsContainer } | `
  11.   Sort-Object -Property @{e = { $_.Name.ToLower() } }, @{e = { $_LastWriteTime }; d = $true } |`
  12.   Group-Object -Property @{e = { $_.Name.ToLower() } } | ForEach-Object {
  13.   $_.Group | Select-Object -Skip 1
  14. } | Remove-Item -WhatIf
复制代码
先测试看看删除文件是否正确,然后再去掉参数 -WhatIf,就能真正删除文件了.
作者: jave000    时间: 2022-1-19 13:30

回复 3# idwma


红字报错

   iex : At line:7 char:17
+ if(!$ContainsKey($_.name)){$a+=@{$_.name=$_}}elseif($a[$_.name].LastW ...
+                 ~
Unexpected token '(' in expression or statement.
At line:7 char:17
+ if(!$ContainsKey($_.name)){$a+=@{$_.name=$_}}elseif($a[$_.name].LastW ...
+                 ~
Missing closing ')' after expression in 'if' statement.
At line:6 char:34
+ dir -rec $fb|?{!$PSIsContainer}|%{
+                                  ~
Missing closing '}' in statement block or type definition.
At line:7 char:26
+ if(!$ContainsKey($_.name)){$a+=@{$_.name=$_}}elseif($a[$_.name].LastW ...
+                          ~
Unexpected token ')' in expression or statement.
At line:7 char:46
+ if(!$ContainsKey($_.name)){$a+=@{$_.name=$_}}elseif($a[$_.name].LastW ...
+                                              ~~~~~~
Unexpected token 'elseif' in expression or statement.
At line:7 char:100
+ ... e=$_}}elseif($a[$_.name].LastWriteTime -gt $_.LastWriteTime){del $_.f ...
+                                                                 ~
Unexpected token '{' in expression or statement.
At line:7 char:117
+ ... e].LastWriteTime -gt $_.LastWriteTime){del $_.fullname}elseif($a[$_.n ...
+                                                            ~~~~~~
Unexpected token 'elseif' in expression or statement.
At line:7 char:171
+ ... lname}elseif($a[$_.name].LastWriteTime -lt $_.LastWriteTime){del $a[$ ...
+                                                                 ~
Unexpected token '{' in expression or statement.
At line:8 char:1
+ }
+ ~
Unexpected token '}' in expression or statement.
At line:1 char:69
+ ... pe C:\Users\CXMPV\ONEDRI~1\Desktop\Others\BACKUP~1.BAT|out-string|iex
+                                                                       ~~~
    + CategoryInfo          : ParserError: ( [Invoke-Expression], ParseException
    + FullyQualifiedErrorId : UnexpectedToken,Microsoft.PowerShell.Commands.InvokeExpressionCommand
作者: jave000    时间: 2022-1-19 13:33

回复 4# flashercs


    看起来运算也包含了回收站?虽然我清空了回收站,不知道它从哪找到的


What if: Performing the operation "Remove File" on target "\\ccns010006\Projects\CISS_SIB_AP_2020\02_Technip\SIB Project\007 Piping\ShareThem\Guideline\Caojing Site PDS Project Map.pdf".
What if: Performing the operation "Remove File" on target "\\ccns010006\Projects\CISS_SIB_AP_2020\02_Technip\SIB Project\007 Piping\ShareThem\Class\For Line List\CISS-ST-QC-301_Attachment.pdf".
What if: Performing the operation "Remove File" on target "\\ccns010006\Projects\CISS_SIB_AP_2020\02_Technip\SIB Project\007 Piping\ShareThem\Class\Pipe\CS_9196_20161101_EN.pdf".
What if: Performing the operation "Remove File" on target "\\ccns010006\Projects\CISS_SIB_AP_2020\02_Technip\SIB Project\007 Piping\ShareThem\Class\Pipe\CS_9251_20190301_EN.pdf".
What if: Performing the operation "Remove File" on target "\\ccns010006\Projects\CISS_SIB_AP_2020\02_Technip\SIB Project\007 Piping\ShareThem\Class\Ordering Standard\CS_9484_20190301_EN.pdf".
What if: Performing the operation "Remove File" on target "\\ccns010006\Projects\CISS_SIB_AP_2020\02_Technip\SIB Project\007 Piping\ShareThem\Folder\30_Engineering\02_Piping\30_02_01_Piping_Design\B1.3.6 Pipe Standard Support\Pipe Supports.pdf".
What if: Performing the operation "Remove File" on target "\\ccns010006\Projects\CISS_SIB_AP_2020\02_Technip\SIB Project\007 Piping\ShareThem\Class\Pipe\WN_1000-00312.pdf".
What if: Performing the operation "Remove File" on target "\\ccns010006\Projects\CISS_SIB_AP_2020\02_Technip\SIB Project\007 Piping\ShareThem\Class\Ordering Standard\WN_1057-00022.pdf".
What if: Performing the operation "Remove File" on target "\\ccns010006\Projects\CISS_SIB_AP_2020\02_Technip\SIB Project\007 Piping\ShareThem\Folder\30_Engineering\02_Piping\30_02_01_Piping_Design\B1.3.4 Insulation\WN_8101-00001.pdf".
What if: Performing the operation "Remove File" on target "\\ccns010006\Projects\CISS_SIB_AP_2020\02_Technip\SIB Project\007 Piping\ShareThem\Folder\30_Engineering\02_Piping\30_02_01_Piping_Design\B1.3.4 Insulation\WN_8101-00002.pdf".
What if: Performing the operation "Remove File" on target "\\ccns010006\Projects\CISS_SIB_AP_2020\02_Technip\SIB Project\007 Piping\ShareThem\Class\Ordering Standard\WN_8101-00003.pdf".
作者: Batcher    时间: 2022-1-19 14:20

回复 1# jave000


    查重的判断标准是什么,文件名相同就认为是重复吗,不需要判断MD5么?
作者: jave000    时间: 2022-1-19 16:45

回复 7# Batcher


    只看文件名,因为我要备份的文件都是我做的,还总更新,具体信息可能都不同,只有文件名一致,如果不同,我自己也知道。唯一问题就是我可能今天放这个文件夹,明天放那个文件夹,所以希望能有一个指定目录下全子文件夹搜索。
作者: jave000    时间: 2022-1-19 17:09

回复 3# idwma


    $fa='\\ccns010006\Projects\CISS_SIB_AP_2020\02_Technip\SIB Project\007 Piping\ShareThem\'
$fb='C:\Users\CXMPV\OneDrive - Covestro\Desktop\Others\ShareThem\'

我输入这两个地址,结果是在后者地址的sharethem里又创建了一个sharethem,没看懂这段代码该怎么改。

我把后者地址改为$fb='C:\Users\CXMPV\OneDrive - Covestro\Desktop\Others\'重试,根目录放了几个文件,它们和子文件夹中的文件重复,结果并没有删除。
作者: idwma    时间: 2022-1-19 17:20

本帖最后由 idwma 于 2022-1-19 17:29 编辑

回复 9# jave000


    我理解错了,把所有LastWriteTime改成CreationTime试试
  1. $fa='\\ccns010006\Projects\CISS_SIB_AP_2020\02_Technip\SIB Project\007 Piping\ShareThem\*'
  2. $fb='C:\Users\CXMPV\OneDrive - Covestro\Desktop\Others\ShareThem\'
复制代码

作者: jave000    时间: 2022-1-20 09:26

回复 10# idwma


    这种写法从理解上有点难度,我本来以为就是a目录备份成b目录,结果是a目录备份到b目录下。

确实是修改时间,不太可能有时间一样的,理论上我复制命令时,复制过来的都是最新的吧。
我找到一个查重的代码,其实只要这个就也行,复制命令我前缀一个xcopy就好了。
但你这个代码是不是更高级一些,先判断重复,再复制过去?
作者: idwma    时间: 2022-1-20 16:04

回复 11# jave000


    也是先复制再按时间去重,练练手来的,不高级




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2