Board logo

标题: [求助]请教一个文件更新问题,谢谢 [打印本页]

作者: ttkuaile     时间: 2008-4-11 16:08    标题: [求助]请教一个文件更新问题,谢谢
我想把E:\soft\下的一个文件usbcleaner*(*表示软件版本号,不确定) 复制到H:\tools\, 如果H:\tools\下存在同名文件则跳过,不覆盖。 如果H:\tools\下存在usbcleaner*(不同名),则删除usbcleaner*,并将E:\soft\下的usbcleaner*复制到此文件夹。 举个例子: E:\soft\下为usbcleaner20080401.zip,H:\tools\下也为usbcleaner20080401.zip 则跳过,不覆盖。 E:\soft\下为usbcleaner20080401.zip,H:\tools\下为usbcleaner20091123.zip, 则删除usbcleaner20091123.zip,并复制usbcleaner20080401.zip到H:\tools\。 十分感谢。

作者: chenall     时间: 2008-4-11 16:28
随便写了一个,未测试,
for %%i in (e:\soft\usbcleaner*.zip) do if not exist h:\tools\%~nxi (del h:\tools\usbcleaner*.*&&copy %%i h:\tools)

作者: ttkuaile     时间: 2008-4-11 16:55
for %%i in (e:\soft\usbcleaner*.zip) do if not exist h:\tools\%~nxi (del h:\tools\usbcleaner*.*&&copy %%i h:\tools)
似乎不行啊,就算存在同名文件,还是会执行复制操作。 命令或许还能更简单点,E:\soft\确定只存在一个usbcleaner*.*文件。

作者: moniuming     时间: 2008-4-11 21:25
@echo off
for /f "delims=" %%i in ("E:\soft\usbcleaner20080401.zip") do (
set aa="%%~nxi"
if not exist "h:\tools\%aa%" del /s/f/q "h:\tools\usbcleaner*.*"&&copy /y "%%i" "h:\tools"
)

作者: ttkuaile     时间: 2008-4-12 09:10
4楼的方法我试过了,还是不行。 我找到一个能解决的,但是看起来好像挺复杂的。
@echo off set SrcDir=E:\soft set DstDir=H:\tools for /f "tokens=*" %%a in ('dir /b "%SrcDir%\usbcleaner*"') do ( if not exist "%DstDir%\%%a" ( del /q "%DstDir%\usbcleaner*" copy "%SrcDir%\%%a" "%DstDir%\" ) )
[ Last edited by ttkuaile on 2008-4-12 at 09:11 AM ]

作者: bat-zw     时间: 2008-4-12 10:53
楼主说上面的方法能实现,我不敢苟同,按分析照上面的方法在tools文件夹中的usbcleaner*文件只会剩下从soft文件夹中复制过来的最后一个usbcleaner文件(如soft和tools中都只一个usbcleaner文件的当然这种方法能行),我以下的方法是不能删除不同名的文件但能成功复制并做到同名不覆盖。
@echo off
set a=e:\soft\&set b=h:\tools\&set c=usbcleaner
:begin
set /a n+=1
set d=skip=%n%
if "%d%"=="skip=0" set d=
for /f "%d% delims=" %%i in ('dir /b %a% ^| findstr "%c%"') do if exist %b%%%i (goto begin) else (copy %a%%%i %b%%%i)
如soft和tools中都只一个usbcleaner文件可改为:
@echo off
set a=e:\soft\&set b=h:\tools\&set c=usbcleaner
for /f "delims=" %%i in ('dir /b %a% ^| findstr "%c%"') do if exist %b%%%i (goto :eof) else (del /q %b%%c%*&copy %a%%%i %b%%%i)
[ Last edited by zw19750516 on 2008-4-12 at 11:18 AM ]

作者: 26933062     时间: 2008-4-12 12:27
2楼代码是可以的,只是匆忙中少写了个百分号。 若是再加上引号就更完善了,可以防止文件名含空格时出错。 分行写,代码显得更整洁。 5楼提供的代码应该也是可以的,其实和2楼的差不多,只是2楼直接用for查找文件,5楼是用dir查找文件。 而6楼的代码似乎?。。。。。。效率更低。。。。。findstr没必要吧? 更正2楼代码如下 :
@echo off
for %%i in (e:\soft\usbcleaner*.zip) do (
  if not exist "h:\tools\%%~nxi" (
    del h:\tools\usbcleaner*.*
    copy "%%i" h:\tools
))
[ Last edited by 26933062 on 2008-4-12 at 12:36 PM ]

作者: ttkuaile     时间: 2008-4-12 21:09
感谢7楼更正的代码,代码很简洁,效率也很高。 谢谢各位,现在更新U盘上的软件变得简单多了。