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