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 INtutaj to (C:\Users\MVD21\Desktop\test). Spowoduje to, że pętla „body” (akcja za słowem kluczowym DO) zostanie wykonana dokładnie raz , a %iparametrowi 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 testkatalog 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.exedo 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
7znarzę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 oni pausesą dobrą praktyką, więc możesz je zostawić. Prawdopodobnie zechcesz również zachować tę cdinstrukcję, 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
PATHzmiennej środowiskowej? (zaznacz to, jak wspomniano powyżej, echo %PATH%w cmdmonicie).