การแทนที่แอมเปอร์แซนด์และดับเบิลแอมเปอร์แซนด์ใน PowerShell


28

ในตัวประมวลผลดั้งเดิม CMD ของ Windows คุณสามารถใช้&เพื่อสตริงคำสั่งเข้าด้วยกันเพื่อให้ตัวประมวลผลทำงานทันที A &&จะรันคำสั่งที่สองก็ต่อเมื่อคำสั่งแรกเสร็จสมบูรณ์โดยไม่มีข้อผิดพลาด

สิ่งนี้แตกต่างจากคำสั่ง piping พร้อมกับ|ในเอาต์พุตจากคำสั่งแรกที่ไม่ได้ถูกส่งไปยังคำสั่งที่สองคำสั่งจะเรียกใช้เพียงคำสั่งเดียวหลังจากที่อื่นและเอาต์พุตสำหรับแต่ละคำสั่งจะถูกส่งไปยังตำแหน่งปกติ

อย่างไรก็ตามฉันได้รับข้อผิดพลาดเมื่อฉันพยายามใช้&หรือ&&ใน PowerShell มีฟังก์ชั่นที่คล้ายกันใน PowerShell หรือไม่หรือมีการยกเลิกคุณสมบัตินี้หรือไม่



คำถามที่น่าสนใจคือถ้า metaprogramming ของ powershell สามารถใช้เพื่อให้การทำงานนี้ใช้&&
soandos

คำตอบ:


35

&ผู้ประกอบการใน PowerShell เป็นเพียง;หรืออัฒภาค

&&ผู้ประกอบการใน PowerShell จะต้องมีการทำงานในฐานะที่เป็นifคำสั่ง

Command ; if($?) {Command}


1

ลองใช้ฟังก์ชั่นนี้ซึ่งสามารถใช้ได้ในลักษณะเดียวกัน:

function aa() {
    if($?) {
        $command = [string]::join(' ', $args[1..99])
        & $args[0] $command
    }
}

ตอนนี้&&สามารถถูกแทนที่ด้วย; aaซึ่งในขณะที่ยังไม่สมบูรณ์แบบจะรวบรัดมากขึ้น

cls && build

กลายเป็น

cls; aa build

1
เหตุผลใด ๆ ที่ไม่ใช่โวหารสาเหตุที่คุณใช้args[0]และไม่ได้function aa ($cmd)?
ruffin

นี่เป็นวิธีที่เปราะบางในการเรียกใช้คำสั่ง ใช้บล็อกสคริปต์เพื่อส่งคำสั่งไปรอบ ๆ และเรียกใช้คำสั่งเหล่านั้นด้วย.ไม่ใช่&เพราะสิ่งหลังสร้างขอบเขตลูกสำหรับตัวแปร
mklement0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.