cedwee
Goto Top

Skript läuft unter win7 nicht aber unter win10

Moin.
Ich kriege bei meinem Script unter Win7 immer folgenden Fehler raus. Unter Win 10 läuft es ohne Probleme.
Im Anhang befindet sich der Fehlerext und das Script.

Vielleicht kann mir ja jemand helfen

MfG
Cedric


#
# Automatische Verarbeitung von Passwortgeschützen ZIP-Dateien 
# Datei soll entpackt werden, danach in einen anderen Ordner überführt werden.

cd.. C:\Entpacken_LST_Mails_NICHT_VERSCHIEBEN_ODER_LÖSCHEN

$InputFolder = "C:\Entpacken_LST_Mails_NICHT_VERSCHIEBEN_ODER_LÖSCHEN\Input\"  

$IntermediateFolder = "C:\Entpacken_LST_Mails_NICHT_VERSCHIEBEN_ODER_LÖSCHEN\Intermediate\"  

$OutputFolder = "C:\Users\ELW\Desktop\Output enstschlüsselte LST Mails\"  

$Password = "Passwort"  

$ExePath7Zip = ".\Binary\7-Zip\7z.exe"  


#General Functions

Function Open-7ZipFile{
    Param(
        [Parameter(Mandatory=$true)]
        [string]$Source,
        [Parameter(Mandatory=$true)]
        [string]$Destination,
        [string]$Password,
        [Parameter(Mandatory=$true)]
        [string]$ExePath7Zip,
        [switch]$Silent
    )
    $Command = "& `"$ExePath7Zip`" e -o`"$Destination`" -y" + $(if($Password.Length -gt 0){" -p`"$Password`""}) + " `"$Source`""  
    If($Silent){
        Invoke-Expression $Command | out-null
    }else{
        $Command
        Invoke-Expression $Command
    }
}

Function Process-ZipFile{
# Verarbeitung der ZIP-Dateien
foreach ($file in (gci -Path $InputFolder)){

Open-7ZipFile -ExePath7Zip "C:\Program Files\7-Zip\7z.exe" -Source $file.FullName -Destination $IntermediateFolder -Password $Password -Silent  
Remove-Item -Path $file.FullName
}

Sleep -Seconds 2

# Öffnen und Verschieben der PDF-Datei
$file = $null
foreach ($file in (gci -Path $IntermediateFolder)){




# Dateien aus dem Intermediate-Ordner kopieren
 Move-Item -Path $file.FullName -Destination $OutputFolder
# Datei löschen
Remove-Item -Path $file.FullName

#Datei im neuen Ordner öffnen
Start-Process -FilePath ($OutputFolder + "\" + $file.Name)  

}

Start-Sleep 1



}

while ($true) {

Process-ZipFile


sleep 5}



Fehlertext

PS C:\> C:\Entpacken_LST_Mails_NICHT_VERSCHIEBEN_ODER_LÖSCHEN\Verarbeitung.ps1
Invoke-Expression : Der Zeichenfolge, beginnend mit:
Bei Zeile:1 Zeichen:231
+ & "C:\Program Files\7-Zip\7z.exe" e -o"C:\Entpacken_LST_Mails_NICHT_VERSCHIEBEN_ODER_LÖSCHEN\Intermediate\" -y -p"Passwort" "C:\Entpacken_LST_Mails_NICHT_VERSCHIEBEN_ODER_LÖSCHEN\Input\Abschlussbericht_ELR3103_1220407774.pdf.zip <<<< "  
fehlt der Terminator: ".  
Bei C:\Entpacken_LST_Mails_NICHT_VERSCHIEBEN_ODER_LÖSCHEN\Verarbeitung.ps1:39 Zeichen:26
+         Invoke-Expression <<<<  $Command | out-null
    + CategoryInfo          : ParserError: (:String) [Invoke-Expression], IncompleteParseException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString,Microsoft.PowerShell.Commands.InvokeExpressionCommand

Content-ID: 5151088363

Url: https://administrator.de/contentid/5151088363

Ausgedruckt am: 23.11.2024 um 22:11 Uhr

MirkoKR
MirkoKR 30.12.2022 um 17:45:59 Uhr
Goto Top
Moin
Passe doch deine Überschrift zum Text an face-wink

"Skript läuft unter win7 nicht aber unter win10"

VS

"Ich kriege bei meinem Script unter Win7 immer folgenden Fehler raus. Unter Win 10 läuft es ohne Probleme."

... sind die Javascript Versionen dieselbe?
4863114660
Lösung 4863114660 30.12.2022 aktualisiert um 17:52:23 Uhr
Goto Top
Lass die Backslashes am Ende der Pfade in Zeilen 7-11 Weg. Die führen zu einem Escaping der folgenden Anführungszeichen im Konsolenaufruf und sind auch nicht nötig.
p.s. Warum ein Extra Invoke-Expression und nicht gleich Start-Process?
(gci -Path $InputFolder)
Sollte man auch noch auf ZIP-Dateien eingrenzen da ansonsten auch evt. Unterordner in die Liste kommen (Windows 7 PS 2.0 kompatibel da es dort keinen -File Parameter gibt)
Get-ChildItem -Path $InputFolder -Filter *.zip | ?[!$_.PSIsContainer}
Die W7 Maschinen würde ich aber dringend mind. auf PS5.1 hochziehen, die PS 2.0 hat ja nicht wenige Macken.

Gruß S.
mayho33
mayho33 31.12.2022 um 14:44:24 Uhr
Goto Top
Hi!

also zuerst würde ich Invoke-Expression mit Start-Process ersetzen. Invoke-Expression macht nur Sinn, wenn du einen String als Befehl absetzen willst. Zb so:

Function Invoke-Laborious() {
    Param(
            [Parameter(Mandatory=$true)]
            [string]$Expression
        )

        Invoke-Expression "& $($Expression)"  
}

$expression__ = 'Start-Process -FilePath "cmd.exe" -ArgumentList "/c Timeout /T 10"'  
Invoke-Laborious -Expression $expression__


Der BackTick in deinem Invoke-Expression Aufruf ist genau wozu? Meistens wird er als "Word-Wrap-Operator" verwendet. Alle anderen Funktionen die er sonst noch hat sind meiner Ansicht nach in dem Commando das du anwendest eher hinderlich.

Siehe dazu:
learn.microsoft.com/de-de/powershell/module/microsoft.powershell.core/about/about_special_characters?view=powershell-5.1

Ich habe die Extract-Methode mal angepasst:
Function Open-ZipFile{
    Param(
        [Parameter(Mandatory=$true)]
        [string]$ExePath7Zip,
        [string]$Source,
        [string]$Destination,
        
        [Parameter(Mandatory=$true)]
        [string]$Password,
                
        [switch]$Silent
    )
    #$Command = "& `"$ExePath7Zip`" e -o`"$Destination`" -y" + $(if($Password.Length -gt 0){" -p`"$Password`""}) + " `"$Source`"" 

    if([string]::IsNullOrEmpty($Password)) {
        $Command = "$($ExePath7Zip) e $($Source) -o$($Destination) -y"  
    }
    else {
        $Command = "$($ExePath7Zip) e $($Source) -o$($Destination) -p$($Password) -y"  
    }

    If($Silent.IsPresent){
        $result__ = Start-Process -FilePath "cmd.exe"  -ArgumentList "/c $($Command)" -Wait -NoNewWindow  
        #Invoke-Expression "$ $($Command)" | out-null 
    }else{
        $result__ =Start-Process -FilePath "cmd.exe"  -ArgumentList "/c $($Command)" -Wait  
        #Invoke-Expression "$ $($Command)" 
    }
}


$InputFolder        = "C:\Entpacken_LST_Mails_NICHT_VERSCHIEBEN_ODER_LÖSCHEN\Input\"  
$IntermediateFolder = "C:\Entpacken_LST_Mails_NICHT_VERSCHIEBEN_ODER_LÖSCHEN\Intermediate\"  
$OutputFolder       = "C:\Users\ELW\Desktop\Output enstschlüsselte LST Mails\"  
$Password           = "Passwort"  
$ExePath7Zip        = ".\Binary\7-Zip\7z.exe"  

 Open-ZipFile -ExePath7Zip "C:\Program Files\7-Zip\7z.exe" -Source $file.FullName -Destination $IntermediateFolder -Password $Password -Silent  

Das Noun in Powershell sollte, soweit ich mich noch richtig erinnere, nicht mit einer Nummer beginnen. Ich finde das Whitepaper gerade nicht mehr dazu. Eventuell hat es sich aber auch schon erledigt.

Grüße!
Cedwee
Cedwee 31.12.2022 um 14:52:55 Uhr
Goto Top
Moin.
Danke für eure Hilfe.
Jetzt funktioniert alles, hatte vorher auch ganz vergessen mal nach Updates zu gucken.

Habe jetzt auch noch folgenden Code vorne ran gesetzte, damit das Fenster nicht die ganze Zeit offen bleibt.

$window = Add-Type -memberDefinition @"  
[DllImport("user32.dll")]  
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
"@ -name "Win32ShowWindowAsync" -namespace Win32Functions -passThru  

$window::ShowWindow((Get-Process –id $pid).MainWindowHandle, 0) 

Zur Invoke-Expression, vorher gab es noch den Druckbefehl, den brauchte ich auf diesem Rechner nicht, daher hatte ich ihn einfach gelöscht.