在xcopy期间,DOS保留目录结构的一部分?

时间:2012-11-21 21:10:47

标签: batch-file structure dos xcopy

我对DOS批处理文件有点新,而且我很难解决问题的方法。

我需要做什么:我有一个大的,嵌套的源文件夹结构,让我们说它住在这里:

C:\dir1\dir2\dir3\file.txt

我有一个镜像目标结构,虽然根的一部分是不同的:

x:\dirA\dirB\dir1\dir2\dir3\file.txt

我当前的批处理将源结构中的所有文件复制到目标文件夹,保留文件夹结构,这就是我想要的。

问题:
我的脚本的目的是将文件夹从上面的源结构拖到bat文件上,并将文件复制到目标。我想要做的是,允许用户从源目录中拖动文件夹,让我们说/dir2及其所有子文件夹/文件到批处理文件中,然后将内容复制到SAME位置目的地结构...

因此,在此示例中,批处理文件应复制以下内容:

C:\dir1\dir2\

x:\dirA\dirB\dir1\dir2\.

幸运的是(我认为)我的目标文件夹结构不会改变,尽管源可能位于每台机器上的不同位置。所以,如果有一种聪明的方法来检测我在源树中的位置,然后替换目标路径的一部分...... ???

到目前为止,这是我的简单脚本:

    @echo off
    set /p FILETYPE="What file type do you want to copy? (For example use txt, max, f3d, or * to copy all files.)"

    xcopy %1\*.%FILETYPE% c:\output /s 
    pause

非常感谢你们给予的任何帮助! :) 肯

更新:在此处添加更新的代码示例,因为我无法获得格式化评论或允许我使用足够的字符。下面的内容可能不完全正确,我只是尽力清楚。自从我发布这个以来,我已经想出更多,基本上我需要弄清楚如何(或者如果可能)在delims之后使用字符串,它似乎只检查每个字符......

    @echo off
    rem user drag folder onto .bat (left click, move folder using mouse onto .bat icon)
    rem %1 in ex is C:\random_folder\another_folder\proj1\area1\scene23
    set destRoot=X:\companyname\allprojects\proj1
    set rootDir=proj1
    rem assume %1 is folder dragged onto .bat file 
    for /f "tokens=2* delims=<foldername???>" %%a in ("%1") do (
        set part1=%%a
        set chunk=%%b
    ) 
    set finalDest=destRoot+chunk
    xcopy %1\* %finalDest% /E /EXCLUDE:exclusions.txt
    pause

我希望创建这个:“X:\ companyname \ allprojects \ proj1 \ area1 \ scene23”

2 个答案:

答案 0 :(得分:0)

目标文件夹的x:\dirA\dirB\部分是否已知?如果是这样,解决方案很简单:

@echo off
rem Get current directory, ie: "C:\dir1\dir2"
set curDir=%cd%
rem Eliminate the disk drive, ie: "\dir1\dir2"
set curDir=%curDir:~2%
rem Copy to right destination, ie: "x:\dirA\dirB\dir1\dir2"
xcopy *.%FILETYPE% "x:\dirA\dirB%curDir%"

我希望它有所帮助...

编辑: 澄清所要求的新评论

确定。有一个源文件夹和一个目标文件夹。上面的程序假定程序的当前文件夹是源文件夹,但如果需要,可以将其作为参数提供。该计划实现了以下复制过程:

From source folder          -> To destination folder
C:\dir1\dir2                -> x:\dirA\dirB\dir1\dir2
C:\dir1\dir2\dir3           -> x:\dirA\dirB\dir1\dir2\dir3
C:\dir1\dir2\dir3\what\ever -> x:\dirA\dirB\dir1\dir2\dir3\what\ever
C:\XYZ                      -> x:\dirA\dirB\XYZ

如果这不是你想要的,那么尽可能简洁地解释它(使用“文件”,“文件夹”,“部分名称”术语,而不是“我喜欢”,“如果”等),并包括三四个例子。

另外,请注意,对我来说,拖动文件夹表示拖放操作,将源文件夹按下鼠标右键并将其留在批处理文件的图标上。如果您没有参考此操作,请不要使用“拖动”术语;改为使用“复制”(请同时澄清这一点)。

编辑: 新要求的解决方案

OK!在上一个例子之前你没有正确解释!此问题只是匹配两个名称:名字的最后一部分必须与第二个名称中的相同部分匹配,并将第一个名称与第二个名称的其余部分组合在一起。右:

First name:       X:\companyname\allprojects\proj1
Second name: C:\random_folder\another_folder\proj1\area1\scene23
Result:           X:\companyname\allprojects\proj1\area1\scene23

这是解决方案:

@echo off
setlocal EnableDelayedExpansion
rem user drag folder onto .bat (left click, move folder using mouse onto .bat icon)
rem %1 in ex is C:\random_folder\another_folder\proj1\area1\scene23
set sourceFolder=%~1
set destRoot=X:\companyname\allprojects\proj1
rem Get last part of First name (destRoot) ie: lastPart=proj1
for %%a in (%destRoot%) do set lastPart=%%~Na
rem Delete from beginning of second name until that part, ie: result=\area1\scene23
set result=!sourceFolder:*%lastPart%=!
rem And insert the First name before the rest
set result=%destRoot%%result%

或者,将这三个步骤合并为一行:

@echo off
rem user drag folder onto .bat (left click, move folder using mouse onto .bat icon)
rem %1 in ex is C:\random_folder\another_folder\proj1\area1\scene23
set sourceFolder=%~1
set destRoot=X:\companyname\allprojects\proj1
for %%a in (%destRoot%) do set result=%destRoot%%sourceFolder:*%%~Na=%

请注意,如果destRoot可能包含空格,则必须在FOR命令中用引号括起来:for %%a in ("%destRoot%") do ...

答案 1 :(得分:0)

在另一个论坛上得到这个,似乎包含我正在寻找的答案,在这里为其他人分享:

@echo off

REM YOU NEED THIS

setlocal enabledelayedexpansion

REM If the passed parameter string has any spaces you must quote it

REM we unquote it using ~

set PassedString=%~1

REM May as well do the same with string to split on
set DelimString=%~2

REM The delim string must appear exactly ONCE in the passed string

REM Replace the delim string with a symbol which will not be in the
REM path to be split, in this example I use @
set splitsub=@
call set tempstring=!PassedString:%DelimString%=%splitsub%!

REM Use FOR to split the modified string
for /f "tokens=1* delims=%splitsub%" %%A in ("%tempstring%") do set part1=%%A & set part2=%%B

REM Show that the 2 variables contain the desired substrings
echo Passed = %PassedString%
echo Part1  = %part1%
echo Part2  = %part2%

示例输出:

C:\>splitstring.bat "D:\Backup\mystuff\programming\Visual Basic\project\ABCDE\DEF" "project"
Passed = D:\Backup\mystuff\programming\Visual Basic\project\ABCDE\DEF
Part1  = D:\Backup\mystuff\programming\Visual Basic\
Part2  = \ABCDE\DEF

C:\>splitstring.bat "D:\Backup\mystuff\programming\Visual Basic\project\ABCDE\DEF" "mystuff"
Passed = D:\Backup\mystuff\programming\Visual Basic\project\ABCDE\DEF
Part1  = D:\Backup\
Part2  = \programming\Visual Basic\project\ABCDE\DEF