Score:1

ฉันจะเลือกระบุพารามิเตอร์ใน Powershell ได้อย่างไร

ธง cn

ฉันกำลังย้ายรหัสเก่าจาก AutoHotkey 'เพื่อหัวเราะ' และคิดว่าฉันบังเอิญเจอฟีเจอร์ที่ไม่ได้ตั้งใจซึ่งมี...

ฉันอยากจะทำบางอย่างที่ 'ชอบ'

$ws = "ย่อเล็กสุด"
$พารามิเตอร์ = "/k dir F:\" 
เริ่มกระบวนการ cmd.exe ( $(if($parameters){"-argumentlist $parameters"}) )( $(if ($ws){"-windowystyle $ws"}) )

แต่มันไม่เคย 'เชื่อมโยง' พวกมันเป็นคำสั่งเดียว 'แบบองค์รวม' โดยไม่มี อีกด้วย โยนมันทั้งหมดไปที่ cmd.exe - ฉันหวังอย่างไร้เดียงสาว่า Powershell จะสามารถ 'จับ' WindowStyle เองและย่อขนาดหน้าต่าง (ปัจจุบันมันถูกส่งตรงไปยัง cmd.exe ซึ่งไม่สนใจมัน)

ฉันรู้ว่าฉันค่อนข้างโมโห แต่ฉันก็ยังดิ้นรนที่จะหาคำที่เหมาะสมในการค้นหา - about_parsing ก็ไม่มีประโยชน์และตัวอย่างนับล้านของการต่อสตริงก็ไม่ดีเช่นกัน - ฉันอยากให้ Powershell หลุดจริงๆ เพียงพอที่จะให้ฉันเปลี่ยนจากสตริงเป็นพารามิเตอร์ไดนามิก ซึ่งฉันเดาว่าขัดแย้งกับการตัดสินใจออกแบบอย่างมีสติที่ไหนสักแห่ง...

ดังนั้นทางเลือกคือกลุ่มคำสั่ง if เพื่อรองรับการเรียงสับเปลี่ยนของตัวเลือกต่างๆ...

ถ้า ($ws -และ -(ไม่ใช่ $พารามิเตอร์)) {start-process cmd.exe -windowystyle $ws}
if ($parameters -and -(not $ws)) {start-process cmd.exe -argumentlist $parameters}
if ($parameters -and $ws) { start-process cmd.exe -argumentlist $parameters -windowystyle $ws}
...คลื่นไส้

เว้นแต่จะมีใครมีความคิดที่ดีกว่านี้?

Score:4
ธง tz

ส่วนหนึ่งของปัญหาเกี่ยวกับตัวอย่าง "ชอบ" ของคุณคือการจัดกลุ่มทุกอย่างที่ตามมา cmd.exe และส่งต่อไปยัง เริ่มต้นกระบวนการ เป็นพารามิเตอร์ตำแหน่งที่สองแบบสตริงเดียวซึ่งก็คือ รายการอาร์กิวเมนต์. คุณจึงใช้งานสิ่งนี้ได้อย่างมีประสิทธิภาพ:

เริ่มกระบวนการ -FilePath 'cmd.exe' -ArgumentList "-argumentlist /k dir F:\ -windowstyle ย่อเล็กสุด"

สาดน้ำ อาจช่วยคุณได้เล็กน้อยที่นี่ คุณสามารถใช้แฮชเทเบิลเพื่อสร้างชุดพารามิเตอร์แบบไดนามิกที่ส่งก่อนที่คุณจะเรียกใช้จริง เริ่มต้นกระบวนการ. ตัวอย่างเช่น:

# เริ่มต้น hashtable เราจะใช้ splat ด้วยในภายหลัง
#ที่มีพารามิเตอร์ทั้งหมดที่จะใช้เสมอ
#(ว่างก็ได้)
$startParams = @{
    เส้นทางไฟล์ = 'cmd.exe'
}

# เพิ่ม WindowStyle ของคุณแบบมีเงื่อนไข
ถ้า ($ws) {
    $startParams.WindowStyle = $ws
}

# เพิ่ม ArgumentList ของคุณแบบมีเงื่อนไข
ถ้า ($ พารามิเตอร์) {
    $startParams.ArgumentList = $พารามิเตอร์
}

# เรียกใช้ฟังก์ชันด้วยแฮชเทเบิลที่แยก
เริ่มกระบวนการ @startParams
cn flag
คุณตำนาน - ขอบคุณ ฉันรู้ว่ามันเป็นไปได้ แต่แค่ไม่เข้าใจว่าการแก้ไขคืออะไร ทำงานได้อย่างสวยงาม ฉันพบว่า $startParams.Wait = $true ใช้งานได้เช่นกัน (สำหรับพารามิเตอร์ที่ไม่มีค่า แต่เป็นสวิตช์)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา