Twój oryginalny skrypt wykonuje następujące operacje, wiersz po wierszu:
@echo on
Informuje wiersz polecenia, aby wydrukował każde polecenie w pliku wsadowym przed ich wykonaniem. Dzieje się tak, abyś mógł „zobaczyć”, co naprawdę robi, zanim to zrobi.
cd "C:\Users\MVD21\Desktop\test"
C hanges D irectory na co mam nadzieję, że to ścieżka gdzie chcesz spakować wszystkie pliki.
FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"
Parametr IN
tutaj to (C:\Users\MVD21\Desktop\test)
. Spowoduje to, że pętla „body” (akcja za słowem kluczowym DO
) zostanie wykonana dokładnie raz , a %i
parametrowi zostanie przypisana wartość C:\Users\MVD21\Desktop\test
. Nic dziwnego, że to nie robi tego, co chcesz! Wygląda na to, że spakuje cały katalog do jednego pliku .7z.
Jeśli nic nie robi , to prawdopodobnie dlatego, że nie może znaleźć ścieżki 7z.exe
. Jeśli ten plik nie znajduje się w bieżącym katalogu (ten test
katalog wspomniany powyżej), to będzie musiał znajdować się w PATH
(w %PATH%
zmiennej środowiskowej; spróbuj echo %PATH%
w powłoce, aby zobaczyć, co jest ustawione). W przeciwnym razie musisz skopiować 7z.exe
do bieżącego katalogu lub podać bezwzględną ścieżkę do jego lokalizacji (np "C:\Program Files\7-zip\7z.exe" ...
.).
pause
Po zakończeniu skryptu to słowo kluczowe po prostu informuje powłokę, że musi czekać na naciśnięcie klawisza Enter lub zamknięcie wiersza poleceń zamiast natychmiastowego wychodzenia z niego.
Kiedy budujesz skrypt wsadowy (lub cokolwiek innego, co dotyczy kodu), powinieneś przestać traktować cały skrypt jako monolityczną kopię-wklej, której nie rozumiesz (próbujesz), a zamiast tego rozbić swój problem z częściami, które można rozwiązać indywidualnie, a następnie połączyć je ze sobą. Umożliwi to samodzielne rozwiązywanie problemów i tworzenie rozwiązań zamiast prosić kogoś innego o wykonanie całej pracy za Ciebie. Gorąco polecam.
W twoim przypadku masz następujące podkomponenty swojego problemu:
- Iteruj przez (pętla) każdy plik zawarty w danym katalogu.
- Dla każdego podanego pliku umieść go w pliku .7z, wywołując
7z
narzędzie.
Szanse, że ktoś już znajdzie odpowiedź, która zaspokoi twoją konkretną potrzebę, są mniejsze niż szansa na znalezienie bardziej ogólnych elementów indywidualnie.
To pytanie „Jak zrobić coś z każdym plikiem w katalogu w skrypcie wsadowym” rozwiązuje połowę problemu.
Istotą odpowiedzi jest to, że zaczynasz od tej części od odpowiedzi StackOverflow:
for /f "usebackq delims=|" %%f in ('dir /b "c:\program files"') do echo %%f
i zmień część, w której robi coś ( echo %%f
), aby robić to , co chcesz . Wiem, że musisz zmienić tę część, ponieważ przeanalizowałem tekst skryptu i zrozumiałem, co oznacza każdy znak i parametr, więc mogę się zastanowić, gdzie chcę wstawić własny kod.
Oto „kod lotniczy” (niesprawdzony!):
for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~ni.7z" "%i"
Powyższe instrukcje @echo on
i pause
są dobrą praktyką, więc możesz je zostawić. Prawdopodobnie zechcesz również zachować tę cd
instrukcję, jeśli pliki znajdują się w tej ścieżce.
Co nam to pozostawia?
@echo on
cd "C:\Users\MVD21\Desktop\test"
for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~nf.7z" "%f"
pause
Jeśli odpowiesz „To nie działa!”, NIE POMOGĘ ci. Jeśli spróbujesz tego i to nie zadziała, MUSISZ powiedzieć mi w komentarzach następujące informacje:
- Jaki dokładnie komunikat o błędzie pojawia się w wierszu polecenia podczas uruchamiania tych poleceń lub umieszczania ich w pliku wsadowym i uruchamiania ich? Nie skracaj; skopiuj i wklej dane wyjściowe bezpośrednio (umieść je na http://pastebin.com, jeśli jest dużo).
- Jak myślisz, co oznacza komunikat o błędzie?
- Gdzie znajduje się Twoja instalacja 7-zip (ścieżka do pliku)?
- Czy lokalizacja pliku twojej instalacji 7-zip jest zawarta w treści
PATH
zmiennej środowiskowej? (zaznacz to, jak wspomniano powyżej, echo %PATH%
w cmd
monicie).