2

我对 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”

4

2 回答 2

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

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

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

编辑: 新要求的解决方案

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

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

于 2012-11-21T23:38:26.143 回答
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
于 2012-11-23T00:28:51.047 回答