Użycie pliku wsadowego do skompresowania plików jako pojedynczych plików zip

10

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.

Mike Van Dunk
źródło
Także jeśli istnieje łatwiejszy sposób na zrobienie tego za pomocą wbudowanej funkcji zip w systemie Windows 10, byłoby to również w porządku.
Mike Van Dunk

Odpowiedzi:

4

Chcę, aby każdy plik miał swoje własne archiwum zip, a archiwum zip udostępniało nazwę pliku, pomijając oczywiście rozszerzenie.

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ć.)

@ECHO ON

SET SourceDir=C:\folder\source
SET DestDir=C:\folder\destination

CD /D "C:\Program Files\7-Zip"
FOR /F "TOKENS=*" %%F IN ('DIR /B /A-D "%SourceDir%"') DO (
    7z.exe a "%DestDir%\%%~NF.zip" "%SourceDir%\%%~NXF"
)
EXIT

Wiersz poleceń

FOR /F "TOKENS=*" %F IN ('DIR /B /A-D "C:\Folder\Source"') DO 7z.exe a "C:\Folder\Dest\%~NF.zip" "C:\Folder\Source\%~NXF"

Dalsze zasoby

Pimp Juice IT
źródło
4

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:

  1. Iteruj przez (pętla) każdy plik zawarty w danym katalogu.
  2. 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).
allquixotic
źródło
Nie sądzę, że to działa, ponieważ mam 7zip zainstalowany na innym dysku? Wydaje się, że działa, jeśli zrobię cd „Location of 7zip” jak w oryginalnej odpowiedzi. Oczywiście działa to tylko „czasami”. Działało, dopóki nie podłożyłem pod nim kolejnego zdania echa, a teraz nie jest. I tak, staram się zrozumieć więcej na temat plików wsadowych. Próbowałem znaleźć słownik poleceń wsadowych lub tego, czego nie powinienem studiować, więc właściwie to rozumiem. Zaufaj mi, wolę zrozumieć ORAZ sprawić, by działało, niż po prostu działało.
Mike Van Dunk
Wypróbowałem twoje rozwiązanie i nie mogę ci powiedzieć, co to jest wynik, ponieważ plik wsadowy w ogóle nie działa. Otwiera się na krótko z oknem cmd tylko migającym, a następnie zamyka się ponownie. Tak, mam tam przerwę. Mam 7zip zainstalowany zarówno na moim dysku lokalnym, jak i na dodatkowym dysku wewnętrznym, ale nie wydaje się on być częścią środowiska ścieżki
Mike Van Dunk
Naprawdę chciałbym zrozumieć, ale wyszukiwanie w Google niewiele pomaga. Na przykład nie mam pojęcia, czym jest ta komenda lub parametr „dir / b” ani co robi. Wiem, że katalog jest oczywiście katalogiem, ale nie wiem, co to jest / b. Chciałbym, żeby ktoś wytłumaczył, co robią parametry, abym mógł lepiej zrozumieć. Lub jeśli ktoś ma link do strony, na której przegląda tego rodzaju rzeczy, które również byłyby pomocne. Poszukałem „dir / b” w pliku wsadowym i tak naprawdę nic nie mogłem znaleźć. Myślę, że / b ma coś wspólnego z nazwami plików, ale nie jestem pewien.
Mike Van Dunk