Więc próbuję użyć 7zip w pliku wsadowym, aby pobrać pliki do folderu i spakować je jako osobne pliki. Tak więc pierwszy plik otrzymuje własne archiwum zip, a następny i tak dalej. Szukałem w Internecie i wypróbowałem kilka różnych kodów. Do tej pory udało mi się tylko skompresować je jako jeden plik zip i wyprowadzić na pulpit.
Niestety zgubiłem kod, który to zrobił, a teraz utknąłem w tym, co wydaje się nic nie robić.
@echo on
cd "C:\Users\MVD21\Desktop\test"
FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"
pause
Chcę, aby każdy plik miał swoje własne archiwum zip, a archiwum zip udostępniało nazwę pliku, pomijając oczywiście rozszerzenie.
Każda pomoc jest mile widziana.
Odpowiedzi:
Skrypt wsadowy
(Ustaw ścieżkę do folderu źródłowego i docelowego pełnego jawnego w górę, a następnie po prostu uruchom w razie potrzeby. Źródło to miejsce, w którym istnieją pliki, które chcesz skompresować, a miejsce docelowe to miejsce, w którym chcesz je skompresować.)
Wiersz poleceń
Dalsze zasoby
źródło
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 kluczowymDO
) 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 (tentest
katalog wspomniany powyżej), to będzie musiał znajdować się wPATH
(w%PATH%
zmiennej środowiskowej; spróbujecho %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:
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
ipause
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?
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:
PATH
zmiennej środowiskowej? (zaznacz to, jak wspomniano powyżej,echo %PATH%
wcmd
monicie).źródło