Puncte:1

Cum specific opțional parametrii în Powershell?

drapel cn

Port un cod vechi de la AutoHotkey „de râs” și cred că am dat peste o caracteristică neintenționată pe care o avea...

Vreau să pot face ceva „ca”

$ws = „Minimizat”
$parametri = "/k dir F:\" 
start-process cmd.exe ( $(dacă($parametri){"-argumentlist $parametri"}) )( $(dacă ($ws){"-windowystyle $ws"}) )

Dar nu le „concatenă” niciodată într-o singură comandă „holistic” fără de asemenea aruncându-le pe toate la cmd.exe - sper naiv ca Powershell să poată „prinde” WindowStyle în sine, de exemplu, și să minimizeze fereastra (în prezent, este transmis direct la cmd.exe care îl ignoră).

Știu că sunt puțin supărat, dar mă chinui, de asemenea, să găsesc termenii potriviți pe care să îi caut - about_parsing nu a fost de ajutor și nici milioanele de exemple de concatenare a șirurilor nu sunt bune - îmi doresc foarte mult ca Powershell să fie liber suficient pentru a-mi permite să trec de la șiruri la parametri în mod dinamic, ceea ce presupun că este împotriva unei decizii de proiectare conștientă undeva...

Deci alternativa este o grămadă de declarații if pentru a se adapta diferitelor permutări ale opțiunilor...

dacă ($ws -și -(nu $parametri)) {start-process cmd.exe -windowystyle $ws}
if ($parametri -și -(nu $ws)) {start-process cmd.exe -argumentlist $parametri}
if ($parametri -și $ws) {start-process cmd.exe -argumentlist $parametri -windowystyle $ws}
... până la greață

Dacă nu are cineva idei mai bune?

Puncte:4
drapel tz

O parte a problemei cu exemplul tău „like” este că grupează tot ceea ce urmează cmd.exe și trecându-l la Start-Proces ca un al doilea parametru pozițional cu un singur șir care este ArgumentList. Deci, rulați eficient acest lucru:

Start-Process -FilePath 'cmd.exe' -ArgumentList "-argumentlist /k dir F:\ -windowstyle Minimizat"

stropire s-ar putea sa te ajute putin aici. Puteți folosi un hashtable pentru a construi dinamic setul de parametri care sunt trimisi înainte de a apela efectiv Start-Proces. De exemplu:

# inițializați un hashtable pe care îl vom folosi mai târziu
# care are toți parametrii care vor fi întotdeauna utilizați.
# (poate fi și gol)
$startParams = @{
    FilePath = „cmd.exe”
}

# adăugați în mod condiționat WindowStyle
dacă ($ws) {
    $startParams.WindowStyle = $ws
}

# adăugați în mod condiționat ArgumentList
if ($parametri) {
    $startParams.ArgumentList = $parametri
}

# rulați funcția cu hashtable splatted
Start-Process @startParams
drapel cn
Legendă - mulțumesc, știam că este posibil, dar pur și simplu nu înțelegeam care este soluția. Funcționează frumos. Mi-am dat seama că $startParams.Wait = $true funcționează de asemenea (pentru parametrii care de fapt nu au o valoare, dar sunt comutatoare)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.