Powershell-Skipt mit Übergabeparametern
Hallo zusammen,
Ich würde gerne von cmd.exe, mit WIN+R o.ä. eine powershell-Datei test.ps1 aufrufen, und dieser drei Parameter (hier: Stringwerte) übergeben, komme aber nicht
auf die korrekte Syntax dazu.
In test.ps1 soll es eine Main-Funktion als "Einsprungfunktion" geben, in welcher diese Parameter dannweiterverarbeitet werden sollen.
Meine bisherigen Bemühungen:
powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -File ""C:\test.ps1""' -Wait -WindowStyle Normal}"
--> für cmd.exe, WIN+R, o.ä.
Datei test.ps1:
Function Main()
{
param( [string]$param1, [string]$param2, [string]$param2 )
....
}
Main -param1 "String1" -param2 "String2" -param3 "String3"
Bitte um Vorschläge, vielen Dank.
Viele Grüsse, Roger
Ich würde gerne von cmd.exe, mit WIN+R o.ä. eine powershell-Datei test.ps1 aufrufen, und dieser drei Parameter (hier: Stringwerte) übergeben, komme aber nicht
auf die korrekte Syntax dazu.
In test.ps1 soll es eine Main-Funktion als "Einsprungfunktion" geben, in welcher diese Parameter dannweiterverarbeitet werden sollen.
Meine bisherigen Bemühungen:
powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -File ""C:\test.ps1""' -Wait -WindowStyle Normal}"
--> für cmd.exe, WIN+R, o.ä.
Datei test.ps1:
Function Main()
{
param( [string]$param1, [string]$param2, [string]$param2 )
....
}
Main -param1 "String1" -param2 "String2" -param3 "String3"
Bitte um Vorschläge, vielen Dank.
Viele Grüsse, Roger
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 529320
Url: https://administrator.de/contentid/529320
Ausgedruckt am: 22.11.2024 um 03:11 Uhr
5 Kommentare
Neuester Kommentar
Hi,
A) Deine Parameter haben eine Fehler:
Madatory sollte explizit sein, spricht TRUE oder FALSE
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$false)][string]$param1,
[Parameter(Mandatory=$false)][string]$param2,
[Parameter(Mandatory=$false)][string]$param3
)
B) -ExecutionPolicy Bypass ist das Commando für Powershell.exe. Das musst du VOR -Command setzen
C) Warum setzt du vor -ExecutionPolicy ein einfaches Anführungszeichen in deinem Beispiel? Das kann nicht hinhauen
D) ein Argument mit Leerzeichen muss entweder zwischen einfachen oder doppelten Anführungszeichen sitzen.
E) Warum so ein komplizierter Aufruf?? Geht so doch viel einfacher:
Test.ps1
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$false)][string]$param1,
[Parameter(Mandatory=$false)][string]$param2,
[Parameter(Mandatory=$false)][string]$param3
)
BEGIN {
if([string]::IsNullOrEmpty($param1))
{
$param1 = ""
}
if([string]::IsNullOrEmpty($param2))
{
$param2 = ""
}
if([string]::IsNullOrEmpty($param3))
{
$param3 = ""
}
}
PROCESS {
#nested methodes
$result = Main -param1 $param1 -param2 $param2 -param3 $param1
Function Main()
{
Param
(
[Parameter(Mandatory=$false)][string]$param1,
[Parameter(Mandatory=$false)][string]$param2,
[Parameter(Mandatory=$false)][string]$param3
)
...
...
return second -param1 $param1 -param2 $param2 -param3 $param1
}
Function Second()
{
Param
(
[Parameter(Mandatory=$false)][string]$param1,
[Parameter(Mandatory=$false)][string]$param2,
[Parameter(Mandatory=$false)][string]$param3
)
...
...
}
}
END {
#final doings like return a value
return $result
}
Call aus der CMD:
Powershell.exe -ExecutionPolicy Bypass -File "<Pfad zur PS1>" -param1 "das ist der erste Streich" -param2 "und nochmal mit LZ" -param3 OhneLZ
Grüße!
EDIT:
ein Start-Process mit mehr Kontrolle innerhalb einer Methode kannst du so anlegen:
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = $FilePath
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.CreateNoWindow = $true
$pinfo.WindowStyle = ([System.Diagnostics.ProcessWindowStyle]::Hidden)
$pinfo.UseShellExecute = $false
$pinfo.Arguments = $ArgumentList
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
Auf das Ende des Processes warten erreichst du mit:
$p.WaitForExit
oder mit einer Schleife nach dem Aufruf:
$p.Start() | Out-Null
$ProResult = Get-Process -Id $p.Id -ErrorAction SilentlyContinue
while( (($ProResult).HandleCount -gt 0) -or ($ProResult -ne $null) )
{
Start-Sleep -Milliseconds 200
try{
$ProResult = Get-Process -Id $p.Id -ErrorAction SilentlyContinue
}
catch{$ProResult = $null}
}
Den Return von $p bekommst du dann so:
return $p.ExitCode
Was genau meinst Du mit ein Start-Process mit mehr Kontrolle innerhalb einer Methode kannst du so anlegen:
Löst das diesen Code dann ab
Löst das diesen Code dann ab
Nein! Das löst den Code nicht ab. Du hast in deinem vorherigen Post mit - Command ein Start-Process angestoßen.
Das war natürlich Nonsens. Ich wollte dir nur zeigen wie du einen Parameter übergeben kannst, wenn du einen Prozess (z. B. Ein Setup) mit bestimmten Bedingungen anstoßen willst.