2

私は DOS バッチ ファイルに少し慣れていないので、問題を解決する方法について頭を悩ませています。

私がしなければならないこと: 大規模なネストされたソース フォルダー構造があり、ここにあるとしましょう:

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

また、ルートの一部が異なりますが、ミラー化された宛先構造があります。

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

私の現在のバッチは、ソース構造内のすべてのファイルを宛先フォルダーにコピーし、フォルダー構造を維持します。これは私が望むものです。

問題:
私のスクリプトの意図は、フォルダーを上記のソース構造からバット ファイルにドラッグし、ファイルを宛先にコピーさせることです。私がやりたいことは、ユーザーがソースディレクトリからフォルダーをドラッグできるようにすることです。たとえば/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%"

それが役立つことを願っています...

編集: 要求された新しいコメントの明確化

Ok。ソース フォルダ宛先フォルダがあります。上記のプログラムは、プログラムの現在のフォルダーがソース フォルダーであると想定していますが、必要に応じてパラメーターとして指定することもできます。プログラムは、次のコピー プロセスを実現します。

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

これがあなたが望むものではない場合は、できるだけ簡潔に説明してください (「ファイル」、「フォルダー」、「名前の一部」という用語を使用し、「好き」、「もしも」などではありません)。3 つまたは 4 つ含めてください。例。

また、私にとってフォルダのドラッグとは、マウスの右ボタンを押してソースフォルダを取得し、バッチファイルのアイコンの上に置いたままにするドラッグアンドドロップ操作を意味することに注意してください。この操作について言及していない場合は、「ドラッグ」という用語を使用しないでください。代わりに「コピー」を使用してください(この点も明確にしてください)。

編集: 新しい要件への解決策

わかった!最後の例の前に正しく説明していません! この問題は単に 2 つの名前の一致に関するものです。名の最後の部分が 2 番目の名前の同じ部分と一致し、名と残りの名前が結合されている必要があります。右?:

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%

または、3 つの手順を 1 行にまとめます。

@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 に答える