吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2150|回复: 38
上一主题 下一主题
收起左侧

【.Bat】求个批处理,局域网备份文件、资料

  [复制链接]
楼主
熊猫 发表于 2020-8-6 11:40
100吾爱币
本帖最后由 熊猫 于 2020-8-6 13:38 编辑

要求
1、自动登录局域网电脑(不映射盘)命令好像是这个吧 net use \\IP或名称 /user:username password

2、复制前关掉xx1.exe和xx2.exe进程。将D:\我的文件,整个文件夹复制到这个路径\\back-server\RenShiBu

3、复制前能进行对比,已有的文件一模一样无更新的·不复制。反之替换掉!(文件夹、内容没特殊符号,但文件格式比较杂dll,log,ini,lgb,msi,htm,xsl,dat,tgdat,tind,map,rec0,stg,key.kv,.file等等)总之什么乱七八糟的文件都有。

4、每段代码都要有备注,这段代码是干嘛的,那段代码是干嘛的。

5、复制完后需要生成txt日志保存在目标目录下(即\\back-server\RenShiBu),txt名字当前日期+时间,即 2020-08-06-17.23,txt内容:列出复制了那些文件?

支持xp,win7

最佳答案

查看完整内容

楼主,下面是最新的版本,你上面提到的所有情况都有处理和测试过了,我一会儿要出差,下午可能都在路上,如果你还有不满意的地方就只能下午晚点等我到酒店再改了,应该基本上差不多了,希望能够采纳。 [mw_shl_code=bash,true]@echo off&setlocal enabledelayedexpansion @rem 生成log文件名 set output=%date:~,4%-%date:~5,2%-%date:~8,2%_%time%.txt set output=%output::=-% set output=%output: =% @rem 调用函 ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
andersgong 发表于 2020-8-6 11:40
熊猫 发表于 2020-8-7 08:31
日志生成,只有日期。没时间

楼主,下面是最新的版本,你上面提到的所有情况都有处理和测试过了,我一会儿要出差,下午可能都在路上,如果你还有不满意的地方就只能下午晚点等我到酒店再改了,应该基本上差不多了,希望能够采纳。
[Bash shell] 纯文本查看 复制代码
@echo off&setlocal enabledelayedexpansion
 
@rem 生成log文件名
set output=%date:~,4%-%date:~5,2%-%date:~8,2%_%time%.txt
set output=%output::=-%
set output=%output: =%
 
@rem 调用函数完成功能,5个参数分别是源目录,目标目录,用户名,密码,log文件名
@rem 因为windows不允许文件名里有冒号,所以这里把:换成-
call :s D:\我的文件 \\back-server\RenShiBu username password %output::=-%
@echo 文件已备份完成,30秒后自动关闭窗口
choice /t 30 /d y /n >nul
goto :eof
 
:s
@echo %1 %2 %3 %4 %5
set src_path=%1
set dst_path=%2
set username=%3
set password=%4
@rem log生成在目标路径
set log_file=!dst_path!\%5
 
@rem 复制前关掉xx1.exe和xx2.exe进程
TASKKILL /IM xx1.exe
TASKKILL /IM xx2.exe
 
@rem 自动登录局域网电脑(不映射盘),先重启explorer
taskkill /f /im explorer.exe
explorer.exe
net use !dst_path! /user:!username! !password!
 
@rem 生成log文件
@echo>!log_file!
 
@rem 复制前能进行对比,已有的文件一模一样无更新的·不复制。反之替换掉!
for /f "delims=" %%f in ('dir /b/s/a-d^ !src_path!') do (
    @rem 遍历所有子目录,获得文件%%f,然后将%%f中的原路径替换成目标路径,便于比较文件
    set cur_file="%%f"
    call set dst_file=%%cur_file:%src_path%=%dst_path%%%
    set pathb=%%~dpf
    call set dst_path=%%pathb:%src_path%=%dst_path%%%
 
    @rem 创建子目录
    @md !dst_path!
 
    @rem 如果文件不存在,则将need_proc设为2,表示需要覆盖。如果设为1,表示文件存在需要比较内容
    set need_proc=0
    if exist !dst_file! (set need_proc=1) else (set need_proc=2)
 
    if !need_proc!==1 (
        @rem 比较文件二进制,如果输出信息里有"找不到差异"就表示文件相同,否则需要覆盖
        @echo compare !cur_file! !dst_file!
        set need_proc=2
        for /F %%i in ('fc /b !cur_file! !dst_file!^|findstr 找不到差异') do (
            set need_proc=1
        )
    )
 
    @rem 这里是正式覆盖,并且写入log文件
    if !need_proc!==2 (
        @echo copy /y !cur_file! !dst_file!
        copy /y !cur_file! !dst_file!
        @echo !cur_file!>>!log_file!
    )
)
 
:eof
3#
andersgong 发表于 2020-8-6 12:24
你这个操作太复杂了,就算批处理写出来了,中间任何一个步骤出现意外的概率都不低。还不如直接用beyond compare比一下两个目录,那样最简单。
4#
 楼主| 熊猫 发表于 2020-8-6 13:37 |楼主
andersgong 发表于 2020-8-6 12:24
你这个操作太复杂了,就算批处理写出来了,中间任何一个步骤出现意外的概率都不低。还不如直接用beyond com ...

某些原因,不想用软件。。

这类型的软件多的是咯

经了解,bat貌似可以实现我的要求
5#
andersgong 发表于 2020-8-6 13:41
熊猫 发表于 2020-8-6 13:37
某些原因,不想用软件。。

这类型的软件多的是咯

肯定能实现,我都能写,就是有点太麻烦了
6#
xgd8511 发表于 2020-8-6 15:28
有些麻烦,需要构思一下
今天比较忙,没时间写
等到本周日如果还没人帮你写的话,我就尝试一下
7#
andersgong 发表于 2020-8-6 16:22
熊猫 发表于 2020-8-6 13:37
某些原因,不想用软件。。

这类型的软件多的是咯

来吧,兄弟,还是我帮你写一个吧,因为没有网络共享的测试环境(单位都是隔离的),所以我在本机用两个目录测试过,功能完全满足你的要求,然后改为net use连接共享目录:
[Bash shell] 纯文本查看 复制代码
@echo off&setlocal enabledelayedexpansion

@rem 生成log文件名
set output=%date:~,4%-%date:~5,2%-%date:~8,2%_%time%.txt

@rem 调用函数完成功能,5个参数分别是源目录,目标目录,用户名,密码,log文件名
@rem 因为windows不允许文件名里有冒号,所以这里把:换成-
call :s D:\我的文件 \\back-server\RenShiBu username password %output::=-%
pause
goto :eof

:s
@echo %1 %2 %3 %4 %5
set src_path=%1
set dst_path=%2
set username=%3
set password=%4
set log_file=%5

@rem 复制前关掉xx1.exe和xx2.exe进程
TASKKILL /IM xx1.exe
TASKKILL /IM xx2.exe

@rem 自动登录局域网电脑(不映射盘)
net use %2 /user:!username! !password!

@rem 生成log文件
@echo>!log_file!

@rem 复制前能进行对比,已有的文件一模一样无更新的·不复制。反之替换掉!
for /f "delims=" %%f in ('dir /b/s/a-d^ !src_path!') do (
    @rem 遍历所有子目录,获得文件%%f,然后将%%f中的原路径替换成目标路径,便于比较文件
    set cur_file=%%f
    call set dst_file=%%cur_file:%src_path%=%dst_path%%%

    @rem 如果文件不存在,则将need_proc设为2,表示需要覆盖。如果设为1,表示文件存在需要比较内容
    set need_proc=0
    if exist !dst_file! (set need_proc=1) else (set need_proc=2)

    if !need_proc!==1 (
        @rem 比较文件二进制,如果输出信息里有"找不到差异"就表示文件相同,否则需要覆盖
        @echo compare !cur_file! !dst_file!
        set need_proc=2
        for /F %%i in ('fc /b !cur_file! !dst_file!^|findstr 找不到差异') do (
            set need_proc=1
        )
    )

    @rem 这里是正式覆盖,并且写入log文件
    if !need_proc!==2 (
        @echo copy /y !cur_file! !dst_file!
        copy /y !cur_file! !dst_file!
        @echo !cur_file!>>!log_file!
    )
)

:eof
8#
 楼主| 熊猫 发表于 2020-8-6 17:13 |楼主
本帖最后由 熊猫 于 2020-8-6 17:14 编辑
andersgong 发表于 2020-8-6 16:22
来吧,兄弟,还是我帮你写一个吧,因为没有网络共享的测试环境(单位都是隔离的),所以我在本机用两个目 ...

第一次 打开不会复制。闪一下就过去了。
好像登录 局域网电脑那里有啥问题。。

第二次打开就会复制了。

但不是复制文件夹(子文件夹)
生成的日志文件txt,要生成在目标根目录下。你的是生成在本机 当前运行bat的根目录下






9#
andersgong 发表于 2020-8-6 17:27
熊猫 发表于 2020-8-6 17:13
第一次 打开不会复制。闪一下就过去了。
好像登录 局域网电脑那里有啥问题。。

后面两个问题已修改,第一次连接网络共享的只能是每次开机自己先手动访问一次,windows是这样的,以后就可以用net use了:
[Bash shell] 纯文本查看 复制代码
@echo off&setlocal enabledelayedexpansion

@rem 生成log文件名
set output=%date:~,4%-%date:~5,2%-%date:~8,2%_%time%.txt

@rem 调用函数完成功能,5个参数分别是源目录,目标目录,用户名,密码,log文件名
@rem 因为windows不允许文件名里有冒号,所以这里把:换成-
call :s D:\我的文件 \\back-server\RenShiBu username password %output::=-%
pause
goto :eof

:s
@echo %1 %2 %3 %4 %5
set src_path=%1
set dst_path=%2
set username=%3
set password=%4
@rem log生成在目标路径
set log_file=!dst_path!\%5

@rem 复制前关掉xx1.exe和xx2.exe进程
TASKKILL /IM xx1.exe
TASKKILL /IM xx2.exe

@rem 自动登录局域网电脑(不映射盘)
net use !dst_path! /user:!username! !password!

@rem 生成log文件
@echo>!log_file!

@rem 复制前能进行对比,已有的文件一模一样无更新的·不复制。反之替换掉!
for /f "delims=" %%f in ('dir /b/s/a-d^ !src_path!') do (
    @rem 遍历所有子目录,获得文件%%f,然后将%%f中的原路径替换成目标路径,便于比较文件
    set cur_file="%%f"
    call set dst_file=%%cur_file:%src_path%=%dst_path%%%
    set pathb=%%~dpf
    call set dst_path=%%pathb:%src_path%=%dst_path%%%

    @rem 创建子目录
    @md !dst_path!

    @rem 如果文件不存在,则将need_proc设为2,表示需要覆盖。如果设为1,表示文件存在需要比较内容
    set need_proc=0
    if exist !dst_file! (set need_proc=1) else (set need_proc=2)

    if !need_proc!==1 (
        @rem 比较文件二进制,如果输出信息里有"找不到差异"就表示文件相同,否则需要覆盖
        @echo compare !cur_file! !dst_file!
        set need_proc=2
        for /F %%i in ('fc /b !cur_file! !dst_file!^|findstr 找不到差异') do (
            set need_proc=1
        )
    )

    @rem 这里是正式覆盖,并且写入log文件
    if !need_proc!==2 (
        @echo copy /y !cur_file! !dst_file!
        copy /y !cur_file! !dst_file!
        @echo !cur_file!>>!log_file!
    )
)

:eof

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Loker + 1 + 1 我很赞同!

查看全部评分

10#
 楼主| 熊猫 发表于 2020-8-7 08:31 |楼主
andersgong 发表于 2020-8-6 17:27
后面两个问题已修改,第一次连接网络共享的只能是每次开机自己先手动访问一次,windows是这样的,以后就 ...

  
日志生成,只有日期。没时间


关于局域网登录,加上代码重启explorer.exe即可



另外乱码那几个字是什么字??(我们的Windows系统是繁体的。。)
还有执行完成后。麻烦加入30后自动关闭窗口。
并且提示:文件已备份完成,30秒后自动关闭窗口
快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-20 07:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表