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-Key: 83745699982

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

Printed on: June 15, 2024 at 15:06 o'clock

Mitglied: 11078840001
11078840001 Feb 15, 2024 updated at 13:56:03 (UTC)
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
Member: Kraemer
Kraemer Feb 15, 2024 at 13:31:03 (UTC)
Goto Top
Moin,

eine Frage vorab: Wozu Start-Process?

Gruß
Member: MarciMarc85
MarciMarc85 Feb 15, 2024 at 13:53:31 (UTC)
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.
Member: MarciMarc85
MarciMarc85 Feb 15, 2024 at 14:01:15 (UTC)
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  
Mitglied: 11078840001
11078840001 Feb 15, 2024 updated at 14:21:18 (UTC)
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.
Member: MarciMarc85
MarciMarc85 Feb 15, 2024 at 14:15:57 (UTC)
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    
Mitglied: 11078840001
11078840001 Feb 15, 2024 updated at 14:52:07 (UTC)
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" ..........  
Member: mayho33
mayho33 Feb 15, 2024, updated at Feb 16, 2024 at 00:17:51 (UTC)
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