【问题标题】:DOS- keeping portion of directory structure during xcopy?DOS-在xcopy期间保留部分目录结构?
【发布时间】:2012-11-21 21:10:46
【问题描述】:

我对 DOS 批处理文件有点陌生,我很难想出解决问题的方法。

我需要做的:我有一个大型的嵌套源文件夹结构,假设它位于此处:

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

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

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

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

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

所以在这个例子中,批处理文件应该复制里面和下面的所有内容:

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”

【问题讨论】:

    标签: batch-file structure dos xcopy


    【解决方案1】:

    目标文件夹的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%"
    

    希望对你有帮助……

    编辑: 要求对新的 cmets 进行澄清

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

    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
    

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

    另外,请注意,拖动文件夹对我来说意味着拖放操作,将源文件夹按下鼠标右键并将其放在批处理文件的图标上。如果您不是指此操作,请不要使用“拖动”一词;改用“复制”(请同时澄清这一点)。

    编辑: 新要求的解决方案

    好的!在上一个示例之前您没有正确解释!这个问题只是匹配两个名字:名字的最后一部分必须匹配第二个名字中的相同部分,并结合名字和第二个名字的其余部分。对吧?:

    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 ...

    【讨论】:

    • 嗨 Aacini,我确实知道目标文件夹...但是,我的问题是,如果有人拖动文件夹 /dir2 来复制它,而不是拖动文件夹 /dir2/dir3 (注意,有很多文件夹,所以他们可能第一次从 C:\dirA\dirB\dir1\dir2 抓取一些东西,但下次从 C:\dirA\dirB\dir1\someotherdirs\andanotherdir\ 抓取。跨度>
    • 基本上,我需要找到一种能够拖动并复制内容的方法(保持文件夹结构完整)并将它们放在另一棵树的相同位置。如果可以使用尽可能高的通用文件夹名称复制所有内容,我会这样做,但我希望我的用户能够仅拖动所需的文件夹(完全知道他们将递归地获取该文件夹下的所有内容)和让它将内容放在第二个文件夹结构中的正确位置。 (希望我在这里有意义):)
    【解决方案2】:

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

    @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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2013-01-25
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      相关资源
      最近更新 更多