Mam zestaw podstawowych nazw plików, dla każdej nazwy „f” są dokładnie dwa pliki, „f.in” i „f.out”. Chcę napisać plik wsadowy (w systemie Windows XP), który przechodzi przez wszystkie nazwy plików, dla każdego powinien:
- Wyświetl nazwę podstawową „f”
- Wykonaj akcję na „f.in”
- Wykonaj kolejną akcję na „f.out”
Nie mam sposobu, aby wyświetlić zestaw podstawowych nazw plików, poza tym, że na przykład mogę wyszukać * .in (lub * .out).
command-line
windows-xp
batch-file
Luke Halliwell
źródło
źródło
Odpowiedzi:
Zakładając, że masz dwa programy przetwarzające dwa pliki, process_in.exe i process_out.exe:
%% ~ nf to modyfikator podstawiania, który rozwija% f tylko do nazwy pliku. Zobacz inne modyfikatory w https://technet.microsoft.com/en-us/library/bb490909.aspx (w połowie strony) lub tylko w następnej odpowiedzi.
źródło
%%f
dlaczego jest%%~nf
później?~
modyfikatorów do robienia rzeczy, tak jak w moim przykładzie, po prostu pobierz nazwę pliku. Po prostu używam tego na wypadek, gdyby*
wykonał pełną ścieżkę czy coś takiego. Istnieje kilka takich modyfikatorów (w połowie strony): microsoft.com/resources/documentation/windows/xp/all/proddocs/…Możesz użyć tego wiersza, aby wydrukować zawartość pulpitu:
Gdy masz już
%%I
zmienną, łatwo jest na niej wykonać polecenie (po prostu zamień słowo echo w programie)Ponadto ulepszono podstawianie odwołań do zmiennych FOR Można teraz użyć następującej opcjonalnej składni:
https://ss64.com/nt/syntax-args.html
W powyższych przykładach
%I
i PATH można zastąpić innymi prawidłowymi wartościami.%~
Składnia jest zakończony poprawną nazwą zmiennej FOR. Wybór nazw zmiennych, takich jak%I
czyni go bardziej czytelnym i pozwala uniknąć pomyłek z modyfikatorami, które nie rozróżniają wielkości liter.Możesz uzyskać pełną dokumentację, pisząc
FOR /?
źródło
%%I was unexpected at this time.
%I
zamiast%%I
Najprostszym sposobem, jak widzę, jest użycie pętli for, która wywołuje drugi plik wsadowy do przetworzenia, przekazując temu drugiemu plikowi nazwę podstawową.
Według for /? help, basename można wyodrębnić za pomocą opcji nifty ~ n. Tak więc skrypt podstawowy brzmiałby:
Następnie, w process.cmd, załóż, że% 0 zawiera nazwę podstawową i działaj odpowiednio. Na przykład:
Może być lepszy sposób na zrobienie tego w jednym skrypcie, ale zawsze byłem trochę zamglony, jak wyciągać wiele poleceń w jednej pętli for w pliku wsadowym.
EDYCJA: To fantastycznie! Jakoś przegapiłem stronę w dokumentach, która pokazała, że możesz robić wieloliniowe bloki w pętli FOR. Mam zamiar teraz wrócić i przepisać niektóre pliki wsadowe ...
źródło
Rozwijanie postu Nathans . Poniższe czynności wykonają partię zadania w jednym pliku wsadowym.
źródło
Istnieje narzędzie zwykle używane w MS Server (o ile pamiętam) o nazwie forfiles :
Powyższy link zawiera pomoc oraz link do strony pobierania Microsoft.
źródło
Poniższy kod filtruje nazwy plików zaczynające się od podanego podłańcucha. Można to zmienić, aby dopasować do różnych potrzeb, pracując nad ekstrakcją podfazów i instrukcją IF:
źródło
Wyszukanie f.in i f.out rozdzieli koncepcję tego, co należy zapętlić, a czego nie zapętlić, gdy jest używane w pętli for / f.
Chociaż nie pytałeś, dobrym sposobem na przekazywanie poleceń do f.in i f.out byłoby ...
Link do wszystkich poleceń systemu Windows XP: link
Przepraszam, jeśli nie odpowiedziałem poprawnie. Pytanie było dla mnie bardzo trudne do odczytania.
źródło