marcimarc85
Goto Top

Mehrere Parameter an zweites Powershell Script übergeben

Hallo zusammen,

Ich habe ein Script aus dem u.A. 3 Variablen hervorgehen, die ich gern als Parameter an ein zweites Script übergeben möchte

Script1:
$old_version
$new_version
$new_version_name

Script2:
param (
[Parameter(Mandatory=$true)][String]$old_version,
[Parameter(Mandatory=$true)][String]$new_version,
[Parameter(Mandatory=$true)][String]$new_version_name
)
...
...
...

In Script1 starte ich nun den Aufruf von Script2 mit

start-process ".\Script2.ps1" -Argumentlist $old_version $new_version $new_version_name  

Leider führt das immer zu folgendem Fehler:

Start-Process : Es wurde kein Positionsparameter gefunden, der das Argument "<neue Versionsnummer>" akzeptiert.  

was mache ich falsch?

Content-ID: 83745699982

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

Ausgedruckt am: 22.11.2024 um 05:11 Uhr

11078840001
11078840001 15.02.2024 aktualisiert um 14:56:03 Uhr
Goto Top
start-process powershell -NoNewWindow -wait -Argumentlist "-File `"Pfad\zu\script2.ps1`" -old_version $old_version -new_version $new_version -new_version_name $new_version_name"  
oder gleich so
&'.\script2.ps1' -old_version $old_version -new_version $new_version -new_version_name $new_version_name  

https://tio.run/##nY7BCsIwDIbveYochp3gKptnYewuCB7HGIVFHcx2tJlD8N1rFYSKF/ ...

Hatten wir doch vorhin schon ?! 🤔

Powershell Leitfaden für Anfänger
Kraemer
Kraemer 15.02.2024 um 14:31:03 Uhr
Goto Top
Moin,

eine Frage vorab: Wozu Start-Process?

Gruß
MarciMarc85
MarciMarc85 15.02.2024 um 14:53:31 Uhr
Goto Top
Es kommt zwar keine Fehlermeldung, aber dennoch sehe ich nur ganz kurz ein blaues Powershell Fenster aufploppen, ohne Inhalt .
Leider wird das Script dann scheinbar nicht ausgeführt, da die Parameter nicht gewirkt haben.
MarciMarc85
MarciMarc85 15.02.2024 um 15:01:15 Uhr
Goto Top
vielleicht sollte ich auch noch erwähnen, dass ich natürlich hier neutrale Namen verwendet hab, zwecks Datenschutz, aber Script2 beinhaltet auch wiederum eine Variable, die mit dem &-Kommando nicht mehr erkannt wird:

& '.\Script2$var1.ps1' -old_version $old_version -new_version $new_version -new_version_name $new_version_name  


& : Die Benennung ".\Script2_Variable_1.ps1" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt  
11078840001
11078840001 15.02.2024 aktualisiert um 15:21:18 Uhr
Goto Top
Hatten wird doch gerade erst ...🤔 wenn Variablen im String vorhanden sind darf man nur Anführungszeichen benutzen keine Hochkommas, wann liest du endlich mal das Handbuch ?!
&".\Script2$var1.ps1" ..........  
Variable expansion in strings and here-strings

i'm out.
MarciMarc85
MarciMarc85 15.02.2024 um 15:15:57 Uhr
Goto Top
Zitat von @11078840001:

Hatten wird doch gerade erst ...🤔 wenn Variablen im String vorhanden sind darf man nur Anführungszeichen benutzen keine Hochkommas, wann liest du endlich mal das Handbuch ?!

Das hab ich natürlich auch versucht mit den Anführungszeichen. Aber die Fehlermeldung bleibt dieselbe

& ".\Script2$var1.ps1" -old_version $old_version -new_version $new_version -new_version_name $new_version_name    


& : Die Benennung ".\Script2_Variable_1.ps1" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt    
11078840001
11078840001 15.02.2024 aktualisiert um 15:52:07 Uhr
Goto Top
Dann gibt es das Skript mit dem Namen nicht im aktuellen Verzeichnis (Working Directory)

Bedenke das Working Directory nicht unbedingt gleich der Skript-Directory sein muss!

Wenn du also auf ein Skript im selben Ordner wie das aktuelle Skript verweisen willst solltest du die $psscriptroot Variable verwenden
& "$psscriptroot\Script2$var1.ps1" ..........  
mayho33
mayho33 16.02.2024 aktualisiert um 01:17:51 Uhr
Goto Top
Zitat von @MarciMarc85:
Hallo zusammen,
Hi!
Ich habe ein Script aus dem u.A. 3 Variablen hervorgehen, die ich gern als Parameter an ein zweites Script übergeben möchte. [...] In Script1 starte ich nun den Aufruf von Script2 mit
start-process ".\Script2.ps1" -Argumentlist $old_version $new_version $new_version_name    

So funkt das nicht. Sollte in etwa so aussehen:
[CmdletBinding()]
Param 
(   
    [Parameter(Mandatory=$false)][String]$old_version,
    [Parameter(Mandatory=$false)][String]$new_version,
    [Parameter(Mandatory=$false)][String]$new_version_name

)

PROCESS {
    ...
}

Call:
powershell.exe -file "C:\Set-Version.ps1" -old_version "4321" -new_version "1234" -new_version_name "mama"  

in einer Function verdröselt:
Function Set-Version() {
    [CmdletBinding()]
    Param 
    (   
        [Parameter(Mandatory=$false)][String]$old_version,
        [Parameter(Mandatory=$false)][String]$new_version,
        [Parameter(Mandatory=$false)][String]$new_version_name

    )

    BEGIN {
       [string[]]$ArrList += $new_version;
       $ArrList += $old_version
       $ArrList += $new_version_name
    }

    PROCESS {
        return $ArrList   
    }
}

Call:
powershell -command "& { . "c:\Set-Version.ps1"; Set-Version -old_version "1.2.3.4" -new_version "2.3.4.5" -new_version_name  "Meine Mama" }"  

und falls es zwackt mit der Execution-Policy so:
powershell -ep Bypass -command "& { . "c:\Set-Version.ps1"; Set-Version -old_version "1.2.3.4" -new_version "2.3.4.5" -new_version_name  "Meine Mama" }"  

Oder in einem Modul (psm1). Ein Modul setzt ebenfalls Functions voraus (also wie im 2. Beispiel) nur dann eben als Mein.psm1. Das Modul vorher importieren und dann ganz einfach aufrufen wie im Beispiel oben. Also so:
#Annahme dein Modul heißt "Mein.psm1" und liegt auf C:\ 

Import-Module "C:\Mein.psm1"  

$old_version      = '1.2.3.4'  
$new_version      = '2.3.4.5'  
$new_version_name = 'Meine Mama'  

Set-Version -old_version $old_version -new_version $new_version -new_version_name $new_version_name

Grüße