Skopiuj pliki sieciowe o pasujących nazwach z listy plików przy użyciu skryptu wsadowego systemu Windows

0

Mam 2 pliki, z których 1 zawiera określone słowa kluczowe, a drugi zawiera listę ścieżek. Chcę wyszukać słowa kluczowe z pierwszej listy plików na liście ścieżek plików, a jeśli zostaną znalezione, skopiuj pliki z określonej ścieżki do określonego folderu docelowego.

Zawartość pierwszego pliku

Keyword1
Keyword2
Keyword3
Keyword4

Druga zawartość pliku

\\server\path...\Keyword1.txt
\\server\path...\Keyword1_0_1.txt
\\server\path...\Keyword2_0_1.txt
\\server\path...\Keyword2_1_9.txt
\\server\path...\Keyword3_1_0_1.txt

W tym celu muszę napisać skrypt wsadowy systemu Windows.

================================================== ==========

Niestety @ pimp-juice-it Nie jestem pewien, jak wkleić zrzut ekranu. Dlatego skopiuj i wklej wyniki poniżej -

d: \ Temp_Script \ Script> FOR / R "D: \ Temp_Script \ Source \ 33.txt"% G IN (55 *) DO ECHO "55" d: \ Temp_Script \ Script> CALL: FileExist "55" "D: \ Temp_Script \ Source \ 44.txt "d: \ Temp_Script \ Script> FOR / R" D: \ Temp_Script \ Source \ 44.txt "% G IN (55 *) DO ECHO" 55 "d: \ Temp_Script \ Script> WEZWANIE: FileExist „55” „D: \ Temp_Script \ Source \ 55.txt” d: \ Temp_Script \ Script> FOR / R „D: \ Temp_Script \ Source \ 55.txt”% G IN (55 *) DO ECHO ” 55 "d: \ Temp_Script \ Script> CALL: FileExist" 55 "" D: \ Temp_Script \ Source \ 55 - Copy (2) .txt "d: \ Temp_Script \ Script> FOR / R" D: \ Temp_Script \ Source \ 55 - Kopiuj (2) .txt "% G IN (55 *) DO ECHO" 55 "d: \ Temp_Script \ Script> CALL: FileExist" 55 "" D: \ Temp_Script \ Source \ 55 - Copy.txt "

jak widać słowo kluczowe „55” istnieje w UNC, ale nadal warunek nie sprawdza się w True w pętli FOR i przechodzi bezpośrednio do następnego UNC. Poniżej znajduje się kod -

: FileExist FOR / R "% ~ 2" %% G IN (% ~ 1 *) DO ECHO "% ~ 1"

Sujitkar
źródło
Polecam użyć czegoś innego zamiast przetwarzania wsadowego. Jeden z tych plików należy odczytać tyle razy, ile linii w drugim ... PS. Użyj skryptu VBS, na przykład ...
Akina

Odpowiedzi:

0

Możesz raz przewinąć listę „słów kluczowych” i użyć iterowanych wartości słów kluczowych wraz z niektórymi dołączonymi znakami wieloznacznymi jako ciągami wyszukiwania, tj *<Keyword>* . Możesz przejść do drzewa katalogów każdej wartości ścieżki UNC z listy plików i wykonać operację kopiowania tylko do tych, które istnieją pasujące do szukanego słowa kluczowego.

Zasadniczo jednak ...

  • Pierwsza pętla for / f odczyta kolejno każdy wiersz listy plików łańcuchowych, a wartość każdego wiersza będzie wartością iterowaną, która jest przekazywana przy pierwszym argumencie do polecenia call .
  • Druga pętla for / f odczyta kolejno każdy wiersz listy plików ścieżki UNC i przekaże go, a pierwsza wartość argumentu zostanie przekazana przez pierwszą pętlę for / f jako dwa argumenty z poleceniem call .
  • Ostatnia pętla for / r będzie rekurencyjnie przeszukiwać iterowaną ścieżkę UNC z iterowaną wartością ciągu jako oddzielne argumenty, które zostały przekazane, a następnie kopiować wszystkie pasujące pliki.

Skrypt partii

@ECHO ON

SET "strList=\\server\Folder\Path\SearchStrings.txt"
SET "pathList=\\server\Folder\Path\UNCPaths.txt"
SET "targetPath=\\server\target\folder\path"

FOR /F "USEBACKQ TOKENS=*" %%S IN ("%strList%") DO CALL :Paths "%%~S"
PAUSE
EXIT

:Paths
FOR /F "USEBACKQ TOKENS=*" %%P IN ("%pathList%") DO CALL :FileExist "%~1" "%%~P"
GOTO :EOF

:FileExist
FOR /R "%~2" %%C IN (*%~1*) DO XCOPY /F /Y "%%~C" "%targetPath%\"
GOTO :EOF

Dalsze zasoby

  • For / F

  • Połączenie

    Polecenie CALL przekazuje kontrolę do instrukcji po określonej etykiecie wraz z dowolnymi określonymi parametrami. Aby wyjść z podprogramu, określ, GOTO:eofże spowoduje to przeniesienie kontroli na koniec bieżącego podprogramu.

  • For / R

    FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
    
        Walks the directory tree rooted at [drive:]path, executing the FOR
        statement in each directory of the tree.  If no directory
        specification is specified after /R then the current directory is
        assumed.  If set is just a single period (.) character then it
        will just enumerate the directory tree.
    
Pimp Juice IT
źródło
Sujitkar - Po prostu usuń PAUSEto, exitkiedy to zrobisz, ale odpowiednio dostosuj do swoich potrzeb w razie potrzeby. W razie potrzeby chętnie pomogę w dostosowaniach, więc po prostu wyjaśnij i daj mi znać.
Pimp Juice IT
Dzięki za tak szczegółowe rozwiązanie @ pimp-juice-it. Ale nie jestem w stanie sprawić, żeby to zadziałało FOR / R "% ~ 2" %% C IN ( % ~ 1 ). Ten warunek nigdy nie zwróci wartości True.
Sujitkar,
@Sujitkar - Czy możesz wysłać mi zrzut ekranu lub coś z wyjścia polecenia po uruchomieniu go lub kilka wierszy dla kilku iteracji? Może jest coś, co źle zrozumiałem z twoją konfiguracją, więc jeśli możesz mi pomóc zrozumieć, to może dostosuję się do twoich potrzeb.
Pimp Juice IT
@Sujitkar Ponadto, być może zakładam, że źle, ale na przykład, jeśli masz, Keyword1a następnie masz ścieżkę serwera UNC bez nazwy pliku w pliku, tak po prostu \\server\path...tak, a następnie powinna być nazwa pliku ze Keyword1znakami w tej ścieżce, którą chcesz skopiowałem to istnieje. Lista plików ścieżki UNC z tą metodą NIE powinna zawierać nazw plików ze słowami kluczowymi, a jedynie ścieżkę, aby to działało. Być może dlatego nie działa, jeśli lista plików ścieżki UNC zawiera więcej niż tylko listę ścieżek folderów UNC.
Pimp Juice IT
@Sujitkar Zostawiłem ci kilka komentarzy między tą odpowiedzią a powyższym pytaniem, więc chciałem sprawdzić, czy możesz potwierdzić, że przeczytałeś je wszystkie. Jestem też ciekawy, czy to pomoże w wyjaśnieniu? Zależy mi na tym, aby pomóc ci w rozwiązaniu tego prostego zadania, abyś mógł sprawdzić go z listy i przejść dalej z lepszym zrozumieniem i jednocześnie uczyć się trochę. Daj mi znać, co mogę zrobić, aby pomóc Ci lepiej zrozumieć i / lub rozwiązać to proste zadanie.
Pimp Juice IT,