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

[文件操作] [已解决]xcopy要复制确认但避免“是文件名还是目录名”的询问

我在写一个批处理,想实现比较两个文件夹以其下所有子文件夹下的文件,若[目标文件夹]下不存在[参照文件夹]里的文件(或文件夹)则进行复制。功能已经可以实现了,就是总会询问“是文件名还是目录名”。我用管道“echo f |”放在前头,可是不能达到效果,而是即使有参数/p,也不停一下让我按Y/N。跪求高手指点。

问题示例:
参照文件夹 C:\参照文件夹  其下有文件 1.txt  2.txt  3.txt
                                             子文件夹 a, 其下有文件 a1.txt,  a2.txt   (子文件夹a下还有文件或(和)文件夹)
目标文件夹 D:\目标文件夹  其下有文件 1.txt

所以,我想实现:将 2.txt, 3.txt, \a\a1.txt, \a\a2.txt 复制到 D:\目标文件夹,保留在 C:\参照文件夹 的文件结构

                                                
代码示例:
  1. for ... do (
  2. ...
  3. echo f | xcopy "[参照文件夹(或子文件夹)]下的文件" "[目标文件夹(或子文件夹)]下相应名称的文件"  /p
  4. ...
  5. )
复制代码
用参数/i 好像也没用啊,要怎样自动默认为“目录名”?

经测试发现,即使不在for循环中想实现如此效果也不行。以上问题实际上可以简化成以下示例:
我想实现,既要自动实现对“是文件夹还是文件名”的确认(自动认为是文件夹),又要让用户手动选择是否复制,所以加上参数 /p。但是若在前头加上管道命令 echo f | 的话,批处理就不会等待用户选择是否复制。
我在DOS命令提示符窗口输入
echo f | xcopy C:\File.txt D:\testFolder\CopiedFile.txt /p
(注:运行前D盘中不存在文件夹 testFolder)

结果是:
目标 D:\testFolder\CopiedFile.txt 是文件名
还是目录名
(F = 文件,D = 目录)? f
C:\File.txt (Y/N)?  
C:\File.txt (Y/N)?

C:\File.txt (Y/N)?
C:\File.txt (Y/N)?
C:\File.txt (Y/N)? 复制了 0 个文件

问题已解决
多谢大家的帮助,可以用set /p 的方法实现xcopy的/p的效果,从而解决了此问题:
set /p UserConfirm=要复制吗?(是-Y)
if /i %UserConfirm%==y  echo f| xcopy C:\File.txt D:\testFolder\CopiedFile.txt >nul 2>nul


[ 本帖最后由 phanphan 于 2009-6-15 07:15 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

谢谢各位兄弟,尤其感谢slore ,让我发现自己的粗心。
本人根据“非常批处理verybat.org”中terse的代码,发现自己又定势思维了。我早就觉得一定有一种迂回解决之道,下面的方法正是如此。要实现我所需要的效果,可以如下:
  1. set /p UserConfirm=要复制吗?(是-Y)
  2. if /i %UserConfirm%==y  echo f| xcopy C:\File.txt D:\testFolder\CopiedFile.txt >nul 2>nul
复制代码

[ 本帖最后由 phanphan 于 2009-6-15 00:44 编辑 ]

TOP

原帖由 qzwqzw 于 2009-6-14 23:13 发表
另外,返回问题的根源
似乎是这样
比较参照目录与目标目录
如果目标目录没有参照目录中的某文件或子目录
则将其原目录结构复制到目标目录
这个命题完全可以考虑xcopy /e
而不需要用到for
需要考虑的就是已存在 ...


你的思路效率比较低啊,不过还是谢谢你!用for、xcopy可以实现的

TOP

另外,返回问题的根源
似乎是这样
比较参照目录与目标目录
如果目标目录没有参照目录中的某文件或子目录
则将其原目录结构复制到目标目录
这个命题完全可以考虑xcopy /e
而不需要用到for
需要考虑的就是已存在文件不能被覆盖的文件

办法有两个
一,备份再还原
::先将目标目录b备份到b2
xcopy /e b b2
::再将参照目录a复制到b
xcopy /e a b
::再将备份目录b2还原到b
xcopy /e b2 b

二.排除目标文件列表
::用dir /b b生成目录b的文件列表
dir b /b > bexist.txt
xcopy /exclude:bexist.txt a b
如果b中有子目录
则列表生成要复杂些
先dir /s
一般要用for+set替换掉目录前缀

TOP

楼主的问题说难不难
不要再考虑echo f|
而考虑xcopy C:\File.txt D:\testFolder\CopiedFile.txt目标文件不再改名
这样就可以xcopy /i /p C:\Test\File.txt* D:\testFolder

如果既要新建目录又要改名
建议用md+xcopy
md D:\TestFolder 2>nul
xcopy /p C:\File.txt D:\testFolder\CopiedFile.txt

[ 本帖最后由 qzwqzw 于 2009-6-14 22:49 编辑 ]

TOP

原帖由 slore 于 2009-6-14 16:18 发表
echo f |
echo f|


问题的焦点,不是如何自动输入"f"。焦点是:用了 echo f|.... 后,xcopy的参数 /p 起不了作用。xcopy的帮助说,/p的作用是:创建每个目标文件前提示,但是也许是因为这会和管道命令冲突而失效。所以,我想寻找一种方法,就是既能自动输入f,然后又能创建每个目标文件前提示。请大大明示!谢谢

TOP

仔细看。。。

echo f |
echo f|

TOP

原帖由 keen 于 2009-6-14 15:25 发表
请查看xcopy /?
注意,xcopy有/f参数,及其用法。


当然,我看过xcopy的帮助不知多少遍了,请大大们亲自测试一下上述的那句命令吧,看看有么有什么迂回解决之道

TOP

回复 1楼 的帖子

请查看xcopy /?
注意,xcopy有/f参数,及其用法。
(*^_^*)

TOP

原帖由 slore 于 2009-6-14 10:26 发表
echo f|xcopy ...


我是那样子,但会出现我在1楼说的情况

TOP

echo f|xcopy ...

TOP

返回列表