kiso222
Goto Top

PowerShell Return Value

Hallo liebe Community,

ich lerne derzeit Powershell und habe ein Problem mit den Return Values und bitte um Hilfe.

Code:

function Compress-Folder {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)][String]$Path,
        [Parameter(Mandatory = $true)][String]$destinationPath,
        [Parameter(Mandatory = $false)][String]$sevenZipPath,
        #[Parameter(Mandatory = $false)][String]$password,
        [Parameter(Mandatory = $false)][String]$zipFileName = "folder.zip"  
    )
    
    begin {
        #Ordnerpfade anpassen, dass sie immer auf \ enden.
        if (!($Path.EndsWith("\"))) {  
            $Path = $Path + "\"  
        }

        if (!($destinationPath.EndsWith("\"))) {  
            $destinationPath = $destinationPath + "\"  
        }     
        
        $destinationFilePath = $destinationPath + $zipFileName
    }
    
    process {  
        #Wenn möglich 7zip, sonst Windows integrierter Zip
        if (Test-Path $sevenZipPath) { 
            Write-Host "Verwende 7-Zip zum komprimieren."                       
            &$sevenZipPath a -tzip $destinationFilePath $Path\*    
            write-host $LASTEXITCODE
            return $LASTEXITCODE
        }
        else {            
            Write-Host "Verwende Windows Zipper zum komprimieren."  
            Write-Host "Packe nach: $destinationFilePath."  
            Compress-Archive -Path $Path -DestinationPath $destinationFilePath
            # try {
            #     Compress-Archive -Path $Path -DestinationPath $destinationFilePath
            # }
            # catch{
            #     return 1
            # }             

            return 0               
           
        }   
    }
    
    end {
    }
}

Funktionsaufruf:
$compressFolderExitCode = Compress-Folder -Path $sourcePath -destinationPath $tempPath -sevenZipPath $sevenZipPath -zipFileName $zipFileName
Write-Host $compressFolderExitCode

Ausgabe bzw. ReturnValue:
0 #von write-host $LASTEXITCODE in Compress-Folder, Richtiger Wert
 7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21  Scanning the drive: 2 folders, 0 files, 0 bytes  Creating archive: C:\Users\Felix\Temp\export.zip  Add new data to archive: 2 folders, 0 files, 0 bytes   Files read from disk: 0 Archive size: 322 bytes (1 KiB) Everything is Ok 0 #von Write-Host $compressFolderExitCode im eigentlichen Funktionsaufruf

Ich habe jetzt schon gelesen, dass return in Powershell anders funktioniert als in anderen Programmiersprachen. Allerdings verstehe ich nicht ganz, wie ich nun an meinen gewünschten Wert komme.

Könnte mir bitte jemand anhand dieses Beispiels zeigen, wie an die 0 komme.

Wenn weitere Informationen benötigt werden, dann bitte Bescheid geben.

Vielen Dank schon mal!

Grüße
Felix

Content-ID: 463854

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

Ausgedruckt am: 23.11.2024 um 18:11 Uhr

Kiso222
Kiso222 19.06.2019 um 10:31:35 Uhr
Goto Top
Ich habe es jetzt so verstanden, dass eine Powershell Function ein Array mit allen Variablen der Funktion zurückgibt und der letzte Wert dieses Arrays ist der eigentlich Wert von return ... .

Somit bekomme ich mittels:
Write-Host $compressFolderExitCode[($compressFolderExitCode.Length)-1]

die 0.

Ist das so die Best Practise?
NetzwerkDude
NetzwerkDude 19.06.2019 um 10:55:17 Uhr
Goto Top
In PowerShell wird aus einer function alles was nicht explizit weggemacht wird, returned.

d.h. was du nicht haben willst, der variable $null zuweisen
erikro
erikro 19.06.2019 um 11:25:56 Uhr
Goto Top
Moin,

Zitat von @NetzwerkDude:

In PowerShell wird aus einer function alles was nicht explizit weggemacht wird, returned.

d.h. was du nicht haben willst, der variable $null zuweisen

Wie meinst Du das? Variablen sind in Funktionen wie immer lokal und außerhalb nicht vorhanden. Und das mit dem Array hat der TO, glaube ich, auch nicht richtig verstanden. Deshalb das im Beispiel (Ausgabe der Konsole der ISE) auch nochmal.

$return = test
write-host "Hier fängt die Ausgabe an."  
write-host "Die Funktion test gibt zurück: " -NoNewline  
test
write-host "In `$test1 steht: $test1"  
write-host "In `$test2 steht: $test2"  
$i = 0

while($i -lt $return.length) {

    Write-Host $return[$i]
    $i++
}
Hier fängt die Ausgabe an.
Die Funktion test gibt zurück: Wie geht's  
In $test1 steht: 
In $test2 steht: 
W
i
e
 
g
e
h
t
'  
s

Liebe Grüße

Erik
NetzwerkDude
Lösung NetzwerkDude 19.06.2019 um 12:17:13 Uhr
Goto Top
So meinte ich das:

function gibt_alles_zurück {

    Write-Host "Hallo Host"  
    Write-Output "Hallo normalen Returnwert"  
    Get-Process | select -First 1

}

function gibt_nix_zurück {

    $null = Write-Host "Hallo Host"  
    $null = Write-Output "Hallo normaler Returnwert"  
    $null = Get-Process | select -First 1 

}

gibt_alles_zurück
gibt_nix_zurück

Write-Host nimmt eine Sonderrole ein, da er immer ans "Fenster" was zurückgibt

Und das ist ja die "andersheit" von PS, er liefert alles was in der function ausgegeben wird, auch zurück - bei anderen Programmiertsprachen muss das ja explizit geschehen
Kraemer
Kraemer 19.06.2019 um 12:31:17 Uhr
Goto Top
Moin,
Zitat von @erikro:
Wie meinst Du das? Variablen sind in Funktionen wie immer lokal und außerhalb nicht vorhanden.
Variablen ja - für Ausgaben gilt das aber nicht

Function MyTest {
    $a=1
    $b=2
    $b
    return $a
}

$z=MyTest
$z.GetType()

IsPublic IsSerial Name                                     BaseType                                                           
-------- -------- ----                                     --------                                                           
True     True     Object                                 System.Array   

$z
2
1
erikro
erikro 19.06.2019 um 12:31:34 Uhr
Goto Top
Achso. Ich hatte das anders verstanden. Aber da hast Du recht.
Kraemer
Kraemer 19.06.2019 aktualisiert um 12:39:54 Uhr
Goto Top
Moin Felix,

sieh die unbedingt die Funktionen
Join-Path
Split-Path
an!

Den Parameter für sevenZipPath kannst du dir sparen - den kannst du dir direkt aus der Registry ziehen.

Und was willst du mit dem begin, process und end erreichen?
Kiso222
Kiso222 19.06.2019 um 13:02:13 Uhr
Goto Top
Join-Path
Split-Path

Danke, die Cmdlets werde ich mir anschauen.


Zitat von @Kraemer:
Und was willst du mit dem begin, process und end erreichen?
Das wird von VS Code generiert. Der Übersichtshalber hab ich's drin gelassen.


Den Parameter für sevenZipPath kannst du dir sparen - den kannst du dir direkt aus der Registry ziehen.
Ich würde die 7z.exe evtl. an anderer Stelle ablegen wollen. Daher das Argument.
Kiso222
Kiso222 19.06.2019 um 13:02:58 Uhr
Goto Top
Danke dafür!

I got it! :D
colinardo
colinardo 19.06.2019 aktualisiert um 13:12:57 Uhr
Goto Top
Und was willst du mit dem begin, process und end erreichen?
Die werden erst interessant und essentiell wenn man die Funktion Objekte über die Pipeline verarbeiten lässt.

Nutzt man keine Pipeline sind sie überflüssig.

About Functions Advanced Methods

Grüße Uwe
Kraemer
Kraemer 19.06.2019 um 13:37:47 Uhr
Goto Top
Moin Uwe,

vielen Dank. Das kannte ich noch nicht.

Gruß