私はインターネットからスクリプトを集めて、1 つの親フォルダの下にあるすべてのフォルダを検索し、特定のファイルを見つけて新しい場所にコピーするスクリプトを作成しています。(ディレクトリには、空と使用中のフォルダが無数に存在し、手動で検索せずにいくつかのファイルを見つけようとしています)
これまでのところ、スクリプトは動作しますが、名前付きファイル (Names.txt ドキュメントから) が親フォルダー (...\source) の直下にある場合のみです。親フォルダー内のいずれかのフォルダー (...\source\folder1\folder2\etc) 内にある場合は、検索されず、何も表示されません。何が足りないのでしょうか?
@echo off
pushd C:\Users\username\Desktop\TestBatches
set /p SourceFolder=Enter the path of source folder and press 'Enter':
cls
for /f "tokens=* delims=" %%a in ('type Names.txt') do xcopy /hrkvy "%SourceFolder%\%%a" ".\destination"
popd
pause
ソース パスを入力するときに、コマンド プロンプトにワイルドカードを入力しますか? または、これを自動的に実行する何かをバッチに入力しますか?
ちょっと迷っています。助けていただきありがとうございます!
答え1
ここでは、高度なバッチの概念について簡単に説明します。
次の例では、バッチを使用しています。機能このタスクを達成するために、これは最も効率的な方法ではありませんが、あなたが達成すべきことの種類を示します。できるやります。私はまだとても疲れているので、この解決策はばかげているかもしれませんが(でも効果はあります)
この道を行かなくても、おそらく「dir /s /b ファイルマスク「あなたが探していたのはこれでした。」
@echo off
:: This assumes that this batch is in the same folder as Names.txt and the .\destination folder
:: This batch DOES NOT check things it should like the existence of %SourceFolder% or if .\destination even exists
Set ThisDir=%~DP0
Set DestinationDir=%ThisDir%\destination
Set NamesFile=%ThisDir%\Names.txt
Set /p SourceFolder=Enter the path of source folder and press [Enter]:
for /f "delims=" %%a in ('type %NamesFile%') do call :SearchName "%%a"
pause
goto :EOF
:: ----------------------------------------------------------------
:SearchName
pushd %SourceFolder%
for /f "delims=" %%f in ('dir /s /b %1') do call :FoundFile "%%f"
popd
goto :EOF
:: ----------------------------------------------------------------
:FoundFile
xcopy /hrkvy "%1" "%DestinationDir%"
goto :EOF
最初のforループは関数を呼び出すだけです:検索名テキスト ファイル内のそれぞれの名前に対して。
の:検索名関数は「Set /p」で指定されたディレクトリに切り替え、「dir /s /b NAME_PASSED_FROM_TEXT_FILE」を実行します。取得した行(見つかったファイル)を:見つかったファイル関数。
の:見つかったファイル関数は渡されたファイルをコピーします。