Kompresja folderów w pliku wsadowym

0

Cześć. Mam taki prosty plik wsadowy, który ZIPuje poprzez 7zip foldery które znajdują się w tej samej lokacji co plik .bat, użytkownik poprzez wyskakujące okienko cmd ustala hasło i tym hasłem wszystkie są szyfrowane.
Ale jedno mi nie pasuje, chcę aby tylko wybrane foldery z lokalizacji gdzie jest .bat były brane pod uwagę a nie wszystkie możliwe. Czy można jakoś łatwo to dostosować do tego?
Myślałem żeby zaznaczac myszką foldery które się chce i przeciągnąć na plik wsadowy żeby je otworzył i tylko do nich zastosował, ale to nie działa w tym przypadku

@echo off
title Pakowanie folderow do archiwow 7z
cls
echo Wpisz dzisiejsze haslo ;)
SET /P hasło=
FOR /D %%F IN ("*") DO ("C:\Program Files\7-Zip\7z.exe" a -p%hasło% -t7z -mx9 -r -y "%%F.7z" "%%F")
echo.
echo Pakowanie folderow zakonczone.
echo.
PAUSE
exit
0

Ten BATowy FOR jest zbędny (skądinąd "podziwiam" zbędne bohaterstwo BATmanów w czasach PowerShella). Skończoną ilość katalogów wejściowych podajesz jako argumenty 7zipa.

https://info.nrao.edu/computing/guide/file-access-and-archiving/7zip/7z-7za-command-line-guide

0

No nie wiem czy taki zbędny, z FOR będziesz miał archiwum na każdy folder, bez FOR jedno archiwum na kilka folderów.

0

FOR jest zrobiony po to żeby każdy folder miał swój zaZipowany odpowiednik zabezpieczony tym samym hasłem. Tylko też te foldery nie mają stałych nazw i codziennie mam nowe, więc zmiana dzień w dzień nazw w .bat może być uciążliwa.

1

Bat jest sporo ograniczony, szybciej w power shellu mozna to zrobic, szkielet rozwiązania:

# Import Windows Forms Assembly
Add-Type -AssemblyName System.Windows.Forms;
Add-Type -AssemblyName System.Drawing;
# Create a Form
$Button_Click = 
{
    foreach($ItemChcecked in $CheckedListBox.CheckedItems) {
        [System.Windows.Forms.MessageBox]::Show($ItemChcecked , "My Dialog Box")
    }
}
$Form = New-Object -TypeName System.Windows.Forms.Form;
$Form.Size = New-Object System.Drawing.Size(500,700)
$Form.StartPosition = 'CenterScreen'
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(0,0)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Wybierz foldery do spakowania:'
$form.Controls.Add($label)
# Create a CheckedListBox
$CheckedListBox = New-Object -TypeName System.Windows.Forms.CheckedListBox;
# Add the CheckedListBox to the Form
$Form.Controls.Add($CheckedListBox);
# Widen the CheckedListBox
$CheckedListBox.Location = New-Object System.Drawing.Point(0,20)
$CheckedListBox.Width = 500;
$CheckedListBox.Height = 600;


$CurrentDir=Get-Location ;
foreach($d in Get-ChildItem -Path $CurrentDir -Directory) {

$x=$CheckedListBox.Items.Add($d.Name,$true);

}
$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Point(0,640)
$Button.Size = New-Object System.Drawing.Size(75,23)
$Button.Text = 'Pakuj'
$Button.Add_Click($Button_Click)
$Form.Controls.Add($Button)

$Form.ShowDialog();


1
Panczo napisał(a):

Bat jest sporo ograniczony, szybciej w power shellu mozna to zrobic

Rzeczywiście szybciej, dałeś 6 razy większą ścianę kodu w której po prostu napisałeś aplikację w winforms. Na tym etapie to chyba lepiej to zrobić w C#.

W bacie możesz to zrobić łatwo na shift:

@echo off
title Pakowanie folderow do archiwow 7z
cls
echo Wpisz dzisiejsze haslo ;)
SET /P hasło=
:next
if [%1]==[] goto exit
"C:\Program Files\7-Zip\7z.exe" a -p%hasło% -t7z -mx9 -r -y "%~1.7z" "%~1"
shift
goto next
:exit
echo.
echo Pakowanie folderow zakonczone.
echo.
PAUSE
exit

i możesz przeciągnąć foldery na plik wsadowy lub w menu Shift+F10 "wkleić" foldery na ten plik.

winrar ma opcję pakowania folderów do osobnych archiwów
screenshot-20230309162917.png

0

nie napisałem aplikacji w winforms, tylko uzyłem winforms do tworzenia GUI dla skryptu.
shift jest rozwiazaniem, faktycznie o nim zapomniałem, dawno nie pisałem nic w bat.

1 użytkowników online, w tym zalogowanych: 0, gości: 1