VisualBasic Batch zum Archivieren mit WinRar in VB umsetzen

Archon2k5

Lt. Commander
Registriert
Okt. 2006
Beiträge
1.196
Hallo!

Ich habe mir hier folgende Kleine Batch geschrieben, um Dateien zu Archivieren und das Archiv auf einem Netzlaufwerk zu sichern.
Diese soll über die Aufgabenplanung in regelmäßigen Abständen ausgeführt werden.

set mydate=%date:~-10,2%-%date:~-7,2%-%date:~-4%
"C:\Program Files\WinRAR\Rar.exe" a -r -m3 -p "X:\Documents_Sicherung_%mydate%.rar" @backup.lst

Das Ganze möchte ich jetzt über eine Oberfläche machen, wo dann die Passworteingabe und eine Progress-Bar erscheint.
Nach erfolgter Archivierung soll es eine Meldung geben und über einen Button wieder beendet werden.

Kann mir da jemand behilflich sein?
Grundlegende VB-Kenntnisse sind vorhanden...
 
Verstehe ich das richtig. Du moechtest ueber den Aufgabenplaner einen regelmaessigen Batchjob starten der dann auf eine Userinteraktion angewiesen ist? Was passiert wenn es keine Userinteraktion gibt? Beendet sich der Batchjob nach einem Timeout oder wartet er ewig? Kann es mehrere Instanzen geben im Rahmen des eingestellten Zeitintervall? Geht es hier um einen Proof of Concept oder soll es produktiv eingesetzt werden? Im letzteren Fall wuerde ich es eher ueber die Powershell oder eine andere Skriptsprache loesen.
 
Zuletzt bearbeitet:
Prinzipiell wartet er ewig, solange die Bedingungen für den start gegeben sind.
Mehrere Instanzen gibt es nicht, da es im Aufgabenplaner ausgeschlossen wird.

Aus dem Batch-Job möchte ich nun eine Exe manchen... :)
 
Ich muss raten, aber das macht doch jede Archivierungssoftware.
Abseits davon, sehe ich hier keine explizite Frage.
 
  • Gefällt mir
Reaktionen: Micke und BAGZZlash
Ich möchte einfach das was in der Batch passiert mit einer Oberfläche verfeinern.
So dass ein Fenster aufgeht in dem man nach dem Pasort gefragt wird und eine Progress-Bar zeigt.
Nach Abschluss die Meldung ok und dann mit einem Button beendet werden kann.

Ich baue mir gerade meine eigene Archivierungs-Sicherungssoftware.
Leider kann man im Win Rar keine automatisierten Jobs anlegen...
 
Einfach einen "System.Diagnostics.Process" erzeugen, in der StartInfo Programm und Kommandozeilenparameter eintragen, den Prozess Starten und auf WaitForExit warten (in der Hoffnung, dass rar das vernünftig macht und der so geöffnete Prozess auch laufen bleibt, bis die Archivierung zuende ist).

Falls rar dann auch noch einen Fortschritt auf der Kommandozeile ausgeben kann, könntest Du das ganze mit den Funktionen von Process.StandardOutput auslesen und irgendwie in Deiner Statusbar anzeigen.

Lustig wird es aber mit dem PW. Das kann ja nicht mehr interaktiv eingegeben werden. Gibst Du es aber per Kommandozeileoption an rar, dann ist es für jeden, der Zugriff auf die laufenden Prozesse des PCs hat, auch im Klartext lesbar bis rar beendet wird. Also müsste man irgendwie mit Process.StandardInput arbeiten.
 
Das RAR ist schon so gemacht, dass das Passwort nicht lesbar ist.
Im CMD erscheinen keine Zeichen, wenn man es eingibt.
Es muss bestätigt werden, dann geht es los.
Die Frage ist nur, wie man es aus einer Passordbox ans CMD übergeben kann.

Ich glaub ich scheitere... :D
 
Archon2k5 schrieb:
Das RAR ist schon so gemacht, dass das Passwort nicht lesbar ist.
Im CMD erscheinen keine Zeichen, wenn man es eingibt.
Dann musst Du sie aber auch DORT eingeben und nicht in Deinem VB Programm. Oder Du muss sie per Process.StandardInput an das Programm senden.

Archon2k5 schrieb:
Die Frage ist nur, wie man es aus einer Passordbox ans CMD übergeben kann.
Wenn die Pay-SW RAR genauso arbeitet wie das freie 7zip, dann steht oben schon alles. Den Rest liefern ein paar Google Abfragen zu dem genannten .NET Objekt (ich gehe mal davon aus, dass Du kein VB6 nutzen willst) und zu den Funktionen.

So klappt es jedenfalls mit 7zip und Passwort
Code:
Dim sysProcess As System.Diagnostics.Process
Dim sResult As String

sysProcess = New System.Diagnostics.Process
sysProcess.StartInfo.FileName = "C:\Program Files\7-Zip\7z.exe"
sysProcess.StartInfo.Arguments = "a -t7z -p -mhe=on m:\test.7z m:\testdata"
sysProcess.StartInfo.WorkingDirectory = "C:\Program Files\7-Zip"

sysProcess.StartInfo.CreateNoWindow = True
' das kann man auch auf "False" setzen wenn man das CMD Fenster sehen will oder das PW dort manuell eingegeben werden soll.

sysProcess.StartInfo.UseShellExecute = False
sysProcess.StartInfo.RedirectStandardOutput = True
sysProcess.StartInfo.RedirectStandardInput = True

sysProcess.Start()
sysProcess.StandardInput.WriteLine("IchBinDasPasswort")
sResult = sysProcess.StandardOutput.ReadToEnd()
sysProcess.WaitForExit()
 
Danke für die Infos...
Nutze schon 5.0 weil ich von 6.0 gar nichts verstehe.
Muss sagen, dass ich da aber komplett auf dem flaschen Weg war.
Habe versucht den Befehl als String ans CMD weiterzugeben.
Dabei stellte sich aber die Frage wie ich z.B. das Datum als Variable in den Dateinamen bringe und eben das Passwort aus einer Passwordbox ins CMD usw.
SysProcess geht über meine VB-Kenntnisse hinaus.
Ich werde mein Glück aber nochmal versuchen, da ich jetzt einen guten Ansatz habe...

Immo habe ich das Problem, dass nicht mal mehr die Batch läuft, obwohl es am Mittag problemlos funktionierte.
CMD-Fenster geht nach der Eingabe eines Passworts einfach wieder zu.
Auch als Adminitrator ausführen hilft nichts...
 
Ich sage es ein letztes Mal, danach bin ich raus, weil ich dich nicht belästigen will.
Es gibt fertige Software, die sowas kann.

Wenn du sie nicht nutzen möchtest, dann kannst du entweder Software selber schreiben, oder in Auftrag geben.

Ich empfehle dir einfach fertige Lösungen zu nutzen. Nicht nur aus Bequemlichkeit, sondern auch Sicherheit und Zuverlässigkeit.
 
Nur dass die meiste fertige Backup-SW das Problem hat, dass sie irgendwelche proprietären Speicherformate nutzt oder nur als kompilierte Version verfügbar ist, von der man nicht weiss, ob sie auch unter Win 12 laufen wird.

Und Zuverlässigkeit? Acronis TI war das schlimmste, was mir jemals auf die Platte kam und in Sachen Zuverlässigkeit fast nicht zu unterbieten. Damit ist es fast irrelevant, ob ich meine damalige Lizenz heute in einer VM noch ans Laufen bekommen würde um auf die alten Backups zugreifen zu können.

Für mich ist jede von mir selber gebastelte Backup-Lösung zuverlässiger und ich kann die 7zip Files auch problemlos auf einen Tablet öffnen, wenn es mal nötig sein sollte.
 
  • Gefällt mir
Reaktionen: BFF
Ich habe das jetzt mal mit PowerShell umgesetzt:
PowerShell:
$HideConsoleWindow = '[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr handle, int state);'
Add-Type -Name WPS -Member $HideConsoleWindow -Namespace CNS -ReferencedAssemblies System.Drawing -ErrorAction SilentlyContinue
[Void][CNS.WPS]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0)

Get-Process | Where-Object -FilterScript {$_.ProcessName -Eq "powershell" -And $_.Id -Ne $PID} | Stop-Process -PassThru

$ErrorActionPreference = "SilentlyContinue"

[Void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

If($MyInvocation.MyCommand.CommandType -Eq "ExternalScript")
{$ScriptPath = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition}
Else{$ScriptPath = Split-Path -Parent -Path ([Environment]::GetCommandLineArgs()[0])
If(-Not$ScriptPath){$ScriptPath = "."}}

Function GenArchiv
{
    $ARC_WinForm = New-Object System.Windows.Forms.Form
    $ARC_LablTB1 = New-Object System.Windows.Forms.Label
    $ARC_LablTB2 = New-Object System.Windows.Forms.Label
    $ARC_LablCnc = New-Object System.Windows.Forms.Label
    $ARC_TextBx1 = New-Object System.Windows.Forms.TextBox
    $ARC_TextBx2 = New-Object System.Windows.Forms.TextBox
    $ARC_ChckBox = New-Object System.Windows.Forms.CheckBox
    $ARC_GrBxCnc = New-Object System.Windows.Forms.GroupBox
   
    $ARC_WinForm.Controls.AddRange(@(
    $ARC_LablTB1,
    $ARC_TextBx1,
    $ARC_LablTB2,
    $ARC_TextBx2,
    $ARC_ChckBox,
    $ARC_LablCnc,
    $ARC_GrBxCnc))
   
    $TMP = "$ScriptPath\TestTemp"
    [String]$PathToZipExe = "$TMP\7zaX64.exe"
    $CurDate = Get-Date -Format "dd-MM-yyyy"
    $Archiv = "$TMP\Documents_Sicherung_$CurDate"
   
    $ARC_WinForm.ClientSize = New-Object System.Drawing.Size(190,160)
    $ARC_WinForm.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
    $ARC_WinForm.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::None
    $ARC_WinForm.BackColor = [System.Drawing.Color]::FromArgb(255,30,30,30)
    $ARC_WinForm.MinimizeBox = $False
    $ARC_WinForm.MaximizeBox = $False
    $ARC_WinForm.ControlBox = $False
    $ARC_WinForm.ShowInTaskbar = $False
    $ARC_WinForm.KeyPreview = $True
    $ARC_WinForm.Topmost = $True
   
    $ARC_LablTB1.Location = New-Object System.Drawing.Point(10,0)
    $ARC_LablTB1.Size = New-Object System.Drawing.Size(190,22)
    $ARC_LablTB1.Font = New-Object System.Drawing.Font("Verdena",9,[System.Drawing.FontStyle]::Bold)
    $ARC_LablTB1.BackColor = [System.Drawing.Color]::FromArgb(255,30,30,30)
    $ARC_LablTB1.ForeColor = [System.Drawing.Color]::Silver
    $ARC_LablTB1.Margin = "4,0,4,0"
    $ARC_LablTB1.TextAlign = "MiddleLeft"
    $ARC_LablTB1.Text = "Kennwort festlegen"
   
    $ARC_TextBx1.Location = New-Object System.Drawing.Point(15,27)
    $ARC_TextBx1.Size = New-Object System.Drawing.Size(158,25)
    $ARC_TextBx1.Font = New-Object System.Drawing.Font("Consolas",11,[System.Drawing.FontStyle]::Regular)
    $ARC_TextBx1.BackColor = [System.Drawing.Color]::FromArgb(255,0,90,0)
    $ARC_TextBx1.ForeColor = [System.Drawing.Color]::White
    $ARC_TextBx1.Cursor = [System.Windows.Forms.Cursors]::Select
    $ARC_TextBx1.UseSystemPasswordChar = $True
    $ARC_TextBx1.MaxLength = 15
    $ARC_TextBx1.TextAlign = "Center"
    $ARC_TextBx1.AutoSize = $False
    $ARC_TextBx1.Add_TextChanged(
    {
        If (-Not([String]::IsNullOrWhiteSpace($ARC_TextBx1.Text)))
        {
            $ARC_TextBx2.Enabled = $True
            $ARC_TextBx2.BackColor = [System.Drawing.Color]::FromArgb(255,0,90,0)
            $ARC_TextBx2.Cursor = [System.Windows.Forms.Cursors]::Select
        }
        Else
        {
            $ARC_TextBx2.Clear()
            $ARC_TextBx2.BackColor = [System.Drawing.Color]::Black
            $ARC_TextBx2.Enabled = $False
        }
       
        $ARC_WinForm.Add_KeyDown(
        {
            If ($_.KeyCode -Eq "Enter")
            {
                If (-Not([String]::IsNullOrWhiteSpace($ARC_TextBx1.Text)))
                {
                    $ARC_TextBx2.Enabled = $True
                    $ARC_TextBx2.BackColor = [System.Drawing.Color]::FromArgb(255,0,90,0)
                    $ARC_TextBx2.Cursor = [System.Windows.Forms.Cursors]::Select
                    $ARC_TextBx2.Select()
                }
                Else
                {
                    $ARC_TextBx2.Clear()
                    $ARC_TextBx2.BackColor = [System.Drawing.Color]::Black
                    $ARC_TextBx2.Enabled = $False
                }
            }
        })
    })
   
    $ARC_LablTB2.Location = New-Object System.Drawing.Point(15,54)
    $ARC_LablTB2.Size = New-Object System.Drawing.Size(158,22)
    $ARC_LablTB2.Font = New-Object System.Drawing.Font("Verdena",9,[System.Drawing.FontStyle]::Bold)
    $ARC_LablTB2.BackColor = [System.Drawing.Color]::FromArgb(255,30,30,30)
    $ARC_LablTB2.ForeColor = [System.Drawing.Color]::Silver
    $ARC_LablTB2.Margin = "4,0,4,0"
    $ARC_LablTB2.TextAlign = "MiddleLeft"
    $ARC_LablTB2.Text = "Erneut eingeben"
   
    $ARC_TextBx2.Location = New-Object System.Drawing.Point(15,81)
    $ARC_TextBx2.Size = New-Object System.Drawing.Size(158,25)
    $ARC_TextBx2.Font = New-Object System.Drawing.Font("Consolas",11,[System.Drawing.FontStyle]::Regular)
    $ARC_TextBx2.BackColor = [System.Drawing.Color]::FromArgb(255,30,30,30)
    $ARC_TextBx2.ForeColor = [System.Drawing.Color]::White
    $ARC_TextBx2.Cursor = [System.Windows.Forms.Cursors]::Default
    $ARC_TextBx2.UseSystemPasswordChar = $True
    $ARC_TextBx2.MaxLength = 16
    $ARC_TextBx2.TextAlign = "Center"
    $ARC_TextBx2.AutoSize = $False
    $ARC_TextBx2.Enabled = $False
    $ARC_TextBx2.Add_TextChanged(
    {
        If ($ARC_TextBx2.Text -Eq $ARC_TextBx1.Text)
        {
            $ARC_TextBx2.BackColor = [System.Drawing.Color]::FromArgb(255,0,90,0)
            $ARC_TextBx2.ForeColor = [System.Drawing.Color]::White
            $Script:mkw = $ARC_TextBx1.Text
        }
        Else
        {
            $ARC_TextBx2.BackColor = [System.Drawing.Color]::FromArgb(255,30,30,30)
            $ARC_TextBx2.ForeColor = [System.Drawing.Color]::Red
        }  
           
        $ARC_WinForm.Add_KeyDown(
        {
            If ($_.KeyCode -Eq "Enter")
            {
                If (Test-Path "$PathToZipExe")
                {
                    $ARC_LablTB1.Text = "Erstelle Archiv ..."
                    $ARC_LablTB2.Text = "Einen Augenblick ..."
                    [Array]$Arguments = "a", "-t7z", "-mx=9", "-p$mkw", "-mhe=on", "-m0=lzma2", "$TMP\Documents_Sicherung_$CurDate.7z", "$TMP\*.txt";
                    & $PathToZipExe $Arguments;
                    Start-Sleep 3
                    $ARC_WinForm.Hide()
                }
           
                If (-Not(Test-Path "$TMP\Documents_Sicherung_$CurDate.7z"))
                {
                    $MSG = [System.Windows.Forms.MessageBox]::Show("Die Archivdatei wurde nicht erstellt!`n`nBitte den Vorgang wiederholen.","Unbekannter Fehler!","OK","Error")
                    If ($MSG -Eq "OK")
                    {
                        [System.Environment]::Exit(0)
                    }
                }
                Else
                {
                    $MSG = [System.Windows.Forms.MessageBox]::Show("Die Archivdatei wurde erstellt.","Vorgang erfolgreich ...","OK","Information")
                    If ($MSG -Eq "OK")
                    {
                        [System.Environment]::Exit(0)
                    }
                }
            }
        })
    })
   
    $ARC_ChckBox.Location = New-Object System.Drawing.Point(15,125)
    $ARC_ChckBox.Size = New-Object System.Drawing.Size(80,20)
    $ARC_ChckBox.Font = New-Object System.Drawing.Font("Verdena",8,[System.Drawing.FontStyle]::Bold)
    $ARC_ChckBox.ForeColor = [System.Drawing.Color]::Silver
    $ARC_ChckBox.Cursor = [System.Windows.Forms.Cursors]::Hand
    $ARC_ChckBox.Margin = "4,0,4,0"
    $ARC_ChckBox.TextAlign = "MiddleLeft"
    $ARC_ChckBox.Checked = $False
    $ARC_ChckBox.Text = "Anzeigen"
    $ARC_ChckBox.Add_CheckStateChanged(
    {
        If ($ARC_ChckBox.Checked -Eq $True)
        {
            $ARC_ChckBox.Checked
            $ARC_ChckBox.ForeColor = [System.Drawing.Color]::Red
            $ARC_TextBx1.UseSystemPasswordChar = $False
            $ARC_TextBx2.UseSystemPasswordChar = $False
            $ARC_ChckBox.Text = "Verbergen"
        }
        Else
        {
            -Not $ARC_ChckBox.Checked
            $ARC_ChckBox.ForeColor = [System.Drawing.Color]::Silver
            $ARC_TextBx1.UseSystemPasswordChar = $True
            $ARC_TextBx2.UseSystemPasswordChar = $True
            $ARC_ChckBox.Text = "Anzeigen"
        }
    })
   
    $ARC_LablCnc.Location = New-Object System.Drawing.Point(100,126)
    $ARC_LablCnc.Size = New-Object System.Drawing.Size(75,20)
    $ARC_LablCnc.Font = New-Object System.Drawing.Font("Verdena",8,[System.Drawing.FontStyle]::Bold)
    $ARC_LablCnc.BackColor = [System.Drawing.Color]::Silver
    $ARC_LablCnc.ForeColor = [System.Drawing.Color]::Black
    $ARC_LablCnc.Add_MouseHover({$ARC_LablCnc.BackColor = [System.Drawing.Color]::Gray;$ARC_LablCnc.ForeColor = [System.Drawing.Color]::Silver})
    $ARC_LablCnc.Add_MouseLeave({$ARC_LablCnc.BackColor = [System.Drawing.Color]::Silver;$ARC_LablCnc.ForeColor = [System.Drawing.Color]::Black})
    $ARC_LablCnc.Cursor = [System.Windows.Forms.Cursors]::Hand
    $ARC_LablCnc.Margin = "4,0,4,0"
    $ARC_LablCnc.TextAlign = "MiddleCenter"
    $ARC_LablCnc.Text = "Abbrechen"
    $ARC_LablCnc.Add_Click({[System.Environment]::Exit(0)})
   
    $ARC_GrBxCnc.Location = New-Object System.Drawing.Point(97,118)
    $ARC_GrBxCnc.Size = New-Object System.Drawing.Size(80,30)
   
    $ARC_TextBx1.Select()
   
    [Void]$ARC_WinForm.ShowDialog()
}
GenArchiv

In den Anhang dieses Beitrags setze ich auch noch ein gezipptes Archiv (Test.zip), mit folgendem Inhalt:
.\Test.ps1
.\TestTemp\7zaX64.exe
.\TestTemp\Test1.txt bis Test5.txt

Die Zip einfach in ein Verzeichnis entpacken und die darin enthaltene Test.ps1 ausführen.
(Rechte Maustaste -> "Mit Powershell ausführen")

7zaX64.exe ist die portable Konsolenversion von 7-Zip.
Es muss also kein Entpacker installiert sein, um Dateien zu archivieren.

Nach jeder Kennworteingabe in der entsprechenden Textbox muss jeweils die Enter-Taste gedrückt werden.
 

Anhänge

  • Test.zip
    540,7 KB · Aufrufe: 136
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Archon2k5
Schönes Script, das nur das von mir oben erwähnte Problem hat:
so lange 7zip läuft kann jeder Prozess mit genügend Rechten das Passwort im Klartext über die Kommandozeilenoptionen auslesen.

Daher übergibt meine Version das PW per StandardInput an den Prozess und das PW ist nur dem Script und 7zip intern bekannt.

Spätestens auf einem Mehrbenutzer-System unterbindet man so einem Admin das (versehnetliche) Mitlesen des PW. Aber auch Trojanern, die zwar die laufenden Prozesse überwachen aber keinen Keylogger installiert haben, macht man die Arbeit einiges schwerer.
 
  • Gefällt mir
Reaktionen: Archon2k5 und NotNerdNotDau
gymfan schrieb:
Daher übergibt meine Version das PW per StandardInput an den Prozess und das PW ist nur dem Script und 7zip intern bekannt.
Das lässt sich auch in PowerShell umsetzen, siehe hier:
https://stackoverflow.com/questions/11447598/redirecting-standard-input-output-in-windows-powershell

oder hier:
http://www.techoutlier.com/posts/2019/04/redirecting-standard-in-with-powershell/

Ich hatte jetzt nur mal auf die Schnelle ein Grundkonzept, welches auf das Vorhaben des TE abzielt, mit PowerShell umgesetzt.

Die von dir gemachten Hinweise auf die Sicherheitsproblematik in dem Skript sind sicher nicht von der Hand zu weisen.
Ich werde mich dann in der nächsten Zeit mal dransetzen und versuchen, das Handling mit dem Kennwort, so wie du es oben in deinem Skript umgesetzt hast, in das PS-Skript einzubauen.
Dürfte kein Problem sein.
 
  • Gefällt mir
Reaktionen: Archon2k5
Hallo und vielen Dank erst mal an NotNerdNotDau für das Skript.
Nur zur Info wegen dem handeln des Passworts.
Es geht nicht um hochsensible Daten, sondern um das Sichern meiner Dokumente usw. auf einem Netzlaufwerk.
Und das WinRAR mit Passwort einerseits, dass die Daten gepackt werden um Speicherplatz zu sparen und das PW damit sie nicht "komplett" ungeschützt auf dem Laufwerk liegen.

Ich werde das Skript mal testen, glaube aber heute komme ich nicht mehr dazu...
 
  • Gefällt mir
Reaktionen: NotNerdNotDau
So, nun habe ich die Sache mit dem "System.Diagnostics.Process" umgesetzt und in das PS-Skript eingebaut.
Funktioniert hier einwandfrei.
Vielen Dank @gymfan für den Hinweis.

PowerShell:
$HideConsoleWindow = '[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr handle, int state);'
Add-Type -Name WPS -Member $HideConsoleWindow -Namespace CNS -ReferencedAssemblies System.Drawing -ErrorAction SilentlyContinue
[Void][CNS.WPS]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0)

Get-Process | Where-Object -FilterScript {$_.ProcessName -Eq "powershell" -And $_.Id -Ne $PID} | Stop-Process -PassThru

$ErrorActionPreference = "SilentlyContinue"

[Void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

If($MyInvocation.MyCommand.CommandType -Eq "ExternalScript")
{$ScriptPath = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition}
Else{$ScriptPath = Split-Path -Parent -Path ([Environment]::GetCommandLineArgs()[0])
If(-Not$ScriptPath){$ScriptPath = "."}}

Function GenArchiv
{
    $ARC_WinForm = New-Object System.Windows.Forms.Form
    $ARC_LablTB1 = New-Object System.Windows.Forms.Label
    $ARC_LablTB2 = New-Object System.Windows.Forms.Label
    $ARC_LablCnc = New-Object System.Windows.Forms.Label
    $ARC_TextBx1 = New-Object System.Windows.Forms.TextBox
    $ARC_TextBx2 = New-Object System.Windows.Forms.TextBox
    $ARC_ChckBox = New-Object System.Windows.Forms.CheckBox
    $ARC_GrBxCnc = New-Object System.Windows.Forms.GroupBox
    
    $ARC_WinForm.Controls.AddRange(@(
    $ARC_LablTB1,
    $ARC_TextBx1,
    $ARC_LablTB2,
    $ARC_TextBx2,
    $ARC_ChckBox,
    $ARC_LablCnc,
    $ARC_GrBxCnc))
    
    $TMP = "$ScriptPath\TestTemp"
    [String]$PathToZipExe = "$TMP\7zaX64.exe"
    $CurDate = Get-Date -Format "dd-MM-yyyy"
    [Array]$Arguments = "a", "-t7z", "-mx=9", "-p", "-mhe=on", "-m0=lzma2", "$TMP\Documents_Sicherung_$CurDate.7z", "$TMP\*.txt";
    
    $ARC_WinForm.ClientSize = New-Object System.Drawing.Size(190,160)
    $ARC_WinForm.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
    $ARC_WinForm.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::None
    $ARC_WinForm.BackColor = [System.Drawing.Color]::FromArgb(255,30,30,30)
    $ARC_WinForm.MinimizeBox = $False
    $ARC_WinForm.MaximizeBox = $False
    $ARC_WinForm.ControlBox = $False
    $ARC_WinForm.ShowInTaskbar = $False
    $ARC_WinForm.KeyPreview = $True
    $ARC_WinForm.Topmost = $True
    
    $ARC_LablTB1.Location = New-Object System.Drawing.Point(10,0)
    $ARC_LablTB1.Size = New-Object System.Drawing.Size(190,22)
    $ARC_LablTB1.Font = New-Object System.Drawing.Font("Verdena",9,[System.Drawing.FontStyle]::Bold)
    $ARC_LablTB1.BackColor = [System.Drawing.Color]::FromArgb(255,30,30,30)
    $ARC_LablTB1.ForeColor = [System.Drawing.Color]::Silver
    $ARC_LablTB1.Margin = "4,0,4,0"
    $ARC_LablTB1.TextAlign = "MiddleLeft"
    $ARC_LablTB1.Text = "Kennwort festlegen"
    
    $ARC_TextBx1.Location = New-Object System.Drawing.Point(15,27)
    $ARC_TextBx1.Size = New-Object System.Drawing.Size(158,25)
    $ARC_TextBx1.Font = New-Object System.Drawing.Font("Consolas",11,[System.Drawing.FontStyle]::Regular)
    $ARC_TextBx1.BackColor = [System.Drawing.Color]::FromArgb(255,0,90,0)
    $ARC_TextBx1.ForeColor = [System.Drawing.Color]::White
    $ARC_TextBx1.Cursor = [System.Windows.Forms.Cursors]::Select
    $ARC_TextBx1.UseSystemPasswordChar = $True
    $ARC_TextBx1.MaxLength = 15
    $ARC_TextBx1.TextAlign = "Center"
    $ARC_TextBx1.AutoSize = $False
    $ARC_TextBx1.Add_TextChanged(
    {
        If (-Not([String]::IsNullOrWhiteSpace($ARC_TextBx1.Text)))
        {
            $ARC_TextBx2.Enabled = $True
            $ARC_TextBx2.BackColor = [System.Drawing.Color]::FromArgb(255,0,90,0)
            $ARC_TextBx2.Cursor = [System.Windows.Forms.Cursors]::Select
        }
        Else
        {
            $ARC_TextBx2.Clear()
            $ARC_TextBx2.BackColor = [System.Drawing.Color]::Black
            $ARC_TextBx2.Enabled = $False
        }
        
        $ARC_WinForm.Add_KeyDown(
        {
            If ($_.KeyCode -Eq "Enter")
            {
                If (-Not([String]::IsNullOrWhiteSpace($ARC_TextBx1.Text)))
                {
                    $ARC_TextBx2.Enabled = $True
                    $ARC_TextBx2.BackColor = [System.Drawing.Color]::FromArgb(255,0,90,0)
                    $ARC_TextBx2.Cursor = [System.Windows.Forms.Cursors]::Select
                    $ARC_TextBx2.Select()
                }
                Else
                {
                    $ARC_TextBx2.Clear()
                    $ARC_TextBx2.BackColor = [System.Drawing.Color]::Black
                    $ARC_TextBx2.Enabled = $False
                }
            }
        })
    })
    
    $ARC_LablTB2.Location = New-Object System.Drawing.Point(15,54)
    $ARC_LablTB2.Size = New-Object System.Drawing.Size(158,22)
    $ARC_LablTB2.Font = New-Object System.Drawing.Font("Verdena",9,[System.Drawing.FontStyle]::Bold)
    $ARC_LablTB2.BackColor = [System.Drawing.Color]::FromArgb(255,30,30,30)
    $ARC_LablTB2.ForeColor = [System.Drawing.Color]::Silver
    $ARC_LablTB2.Margin = "4,0,4,0"
    $ARC_LablTB2.TextAlign = "MiddleLeft"
    $ARC_LablTB2.Text = "Erneut eingeben"
    
    $ARC_TextBx2.Location = New-Object System.Drawing.Point(15,81)
    $ARC_TextBx2.Size = New-Object System.Drawing.Size(158,25)
    $ARC_TextBx2.Font = New-Object System.Drawing.Font("Consolas",11,[System.Drawing.FontStyle]::Regular)
    $ARC_TextBx2.BackColor = [System.Drawing.Color]::FromArgb(255,30,30,30)
    $ARC_TextBx2.ForeColor = [System.Drawing.Color]::White
    $ARC_TextBx2.Cursor = [System.Windows.Forms.Cursors]::Default
    $ARC_TextBx2.UseSystemPasswordChar = $True
    $ARC_TextBx2.MaxLength = 16
    $ARC_TextBx2.TextAlign = "Center"
    $ARC_TextBx2.AutoSize = $False
    $ARC_TextBx2.Enabled = $False
    $ARC_TextBx2.Add_TextChanged(
    {
        If ($ARC_TextBx2.Text -Eq $ARC_TextBx1.Text)
        {
            $ARC_TextBx2.BackColor = [System.Drawing.Color]::FromArgb(255,0,90,0)
            $ARC_TextBx2.ForeColor = [System.Drawing.Color]::White
            $Script:mkw = $ARC_TextBx1.Text
        }
        Else
        {
            $ARC_TextBx2.BackColor = [System.Drawing.Color]::FromArgb(255,30,30,30)
            $ARC_TextBx2.ForeColor = [System.Drawing.Color]::Red
        }   
            
        $ARC_WinForm.Add_KeyDown(
        {
            If ($_.KeyCode -Eq "Enter")
            {
                If (Test-Path "$PathToZipExe")
                {
                    $ARC_LablTB1.Text = "Erstelle Archiv ..."
                    $ARC_LablTB2.Text = "Einen Augenblick ..."
                    $SysProcess = New-Object System.Diagnostics.Process
                    $SysProcess.StartInfo.FileName = $PathToZipExe
                    $SysProcess.StartInfo.Arguments = $Arguments
                    $SysProcess.StartInfo.WorkingDirectory = $TMP
                    $SysProcess.StartInfo.CreateNoWindow = $True
                    $SysProcess.StartInfo.UseShellExecute = $False
                    $SysProcess.StartInfo.RedirectStandardOutput = $True
                    $SysProcess.StartInfo.RedirectStandardInput = $True
                    $SysProcess.Start()
                    $SysProcess.StandardInput.WriteLine("$mkw")
                    [String]$Result = $SysProcess.StandardOutput.ReadToEnd()
                    $SysProcess.WaitForExit()
                    Start-Sleep 3
                    $ARC_WinForm.Hide()
                }
            
                If (-Not(Test-Path "$TMP\Documents_Sicherung_$CurDate.7z"))
                {
                    $MSG = [System.Windows.Forms.MessageBox]::Show("Die Archivdatei wurde nicht erstellt!`n`nBitte den Vorgang wiederholen.","Unbekannter Fehler!","OK","Error")
                    If ($MSG -Eq "OK")
                    {
                        [System.Environment]::Exit(0)
                    }
                }
                Else
                {
                    $MSG = [System.Windows.Forms.MessageBox]::Show("Die Archivdatei wurde erstellt.","Vorgang erfolgreich ...","OK","Information")
                    If ($MSG -Eq "OK")
                    {
                        [System.Environment]::Exit(0)
                    }
                }
            }
        })
    })
    
    $ARC_ChckBox.Location = New-Object System.Drawing.Point(15,125)
    $ARC_ChckBox.Size = New-Object System.Drawing.Size(80,20)
    $ARC_ChckBox.Font = New-Object System.Drawing.Font("Verdena",8,[System.Drawing.FontStyle]::Bold)
    $ARC_ChckBox.ForeColor = [System.Drawing.Color]::Silver
    $ARC_ChckBox.Cursor = [System.Windows.Forms.Cursors]::Hand
    $ARC_ChckBox.Margin = "4,0,4,0"
    $ARC_ChckBox.TextAlign = "MiddleLeft"
    $ARC_ChckBox.Checked = $False
    $ARC_ChckBox.Text = "Anzeigen"
    $ARC_ChckBox.Add_CheckStateChanged(
    {
        If ($ARC_ChckBox.Checked -Eq $True)
        {
            $ARC_ChckBox.Checked
            $ARC_ChckBox.ForeColor = [System.Drawing.Color]::Red
            $ARC_TextBx1.UseSystemPasswordChar = $False
            $ARC_TextBx2.UseSystemPasswordChar = $False
            $ARC_ChckBox.Text = "Verbergen"
        }
        Else
        {
            -Not $ARC_ChckBox.Checked
            $ARC_ChckBox.ForeColor = [System.Drawing.Color]::Silver
            $ARC_TextBx1.UseSystemPasswordChar = $True
            $ARC_TextBx2.UseSystemPasswordChar = $True
            $ARC_ChckBox.Text = "Anzeigen"
        }
    })
    
    $ARC_LablCnc.Location = New-Object System.Drawing.Point(100,126)
    $ARC_LablCnc.Size = New-Object System.Drawing.Size(75,20)
    $ARC_LablCnc.Font = New-Object System.Drawing.Font("Verdena",8,[System.Drawing.FontStyle]::Bold)
    $ARC_LablCnc.BackColor = [System.Drawing.Color]::Silver
    $ARC_LablCnc.ForeColor = [System.Drawing.Color]::Black
    $ARC_LablCnc.Add_MouseHover({$ARC_LablCnc.BackColor = [System.Drawing.Color]::Gray;$ARC_LablCnc.ForeColor = [System.Drawing.Color]::Silver})
    $ARC_LablCnc.Add_MouseLeave({$ARC_LablCnc.BackColor = [System.Drawing.Color]::Silver;$ARC_LablCnc.ForeColor = [System.Drawing.Color]::Black})
    $ARC_LablCnc.Cursor = [System.Windows.Forms.Cursors]::Hand
    $ARC_LablCnc.Margin = "4,0,4,0"
    $ARC_LablCnc.TextAlign = "MiddleCenter"
    $ARC_LablCnc.Text = "Abbrechen"
    $ARC_LablCnc.Add_Click({[System.Environment]::Exit(0)})
    
    $ARC_GrBxCnc.Location = New-Object System.Drawing.Point(97,118)
    $ARC_GrBxCnc.Size = New-Object System.Drawing.Size(80,30)
    
    $ARC_TextBx1.Select()
    
    [Void]$ARC_WinForm.ShowDialog()
}
GenArchiv

Im Anhang die TestNeu.zip mit dem geänderten PS-Skript.
 

Anhänge

  • TestNeu.zip
    541,4 KB · Aufrufe: 133
  • Gefällt mir
Reaktionen: Art Vandelay, Evolutio, Archon2k5 und eine weitere Person
Hab michjetzt nochmal mit dem Skript beschäftigt und es läuft soweit.
Muss jetzt nur noch sehen, dass ich es auf meine Ordner / Laufwerke anpasse, was leider nicht ganz einfach ist.
Hab überhaupt keine Ahnung von PowerShell... :(
In der Batch war das recht einfach, indem ich in die .lst die einzelnen Ordner eingetragen habe.
Auch das Laufwerk anzugeben war einfach und ist hier weitaus komplexer da mich das $TMP, die Pfadangaben usw. irgendwie verwirrt. :)
 
Zuletzt bearbeitet:
@NotNerdNotDau
Puh, Respekt 🤯👍 Woher kriegt man soviel Ahnung von Powershell?
Dagegen wirkt ja Batch wirklich wie ein Scherz.
 
  • Gefällt mir
Reaktionen: NotNerdNotDau
@Fusionator
Vielen Dank für die Blumen.:)

Ich habe mich da über die Jahre reingefuchst, um eben für meine Zwecke möglichst unabhängig von externen Anwendungen zu sein.
Früher war es auch mal Batch, dann irgendwann eben PowerShell.

Es ist sicher nicht alles perfekt und so mancher Profi würde wahrscheinlich die Hände über dem Kopf zusammenschlagen, wenn er meine Skripte begutachten würde.:D
Aber es funktioniert so weit alles und das ist für mich die Hauptsache.

Archon2k5 schrieb:
da mich das $TMP, die Pfadangaben usw. irgendwie verwirrt.
Der $TMP-Ordner diente jetzt nur zu Testzwecken.
Du kannst die Verzeichnisse, auf die du bei dir zugreifen möchtest, ganz leicht anpassen.
Nimm halt Variablen-Bezeichnungen deiner Wahl.
 

Ähnliche Themen

Zurück
Oben