Zamienniki ampersand i double-ampersand w PowerShell

28

W natywnym procesorze CMD systemu Windows można używać &do łączenia ciągów poleceń, dzięki czemu jedno z nich działa natychmiast po drugim. A &&uruchomi drugie polecenie tylko wtedy, gdy pierwsze zakończy się bez błędu.

Różni się to od poleceń potokowych wraz z |tym, że dane wyjściowe z pierwszego polecenia nie są wysyłane do drugiego polecenia, polecenia są po prostu uruchamiane jeden po drugim, a dane wyjściowe dla każdego z nich są wysyłane na swoje zwykłe miejsce.

Jednak pojawia się błąd podczas próby użycia &lub &&w programie PowerShell. Czy są dostępne podobne funkcje w PowerShell, czy też ta funkcja jest przestarzała?

Iszi
źródło
3
Może to pomóc: Jakie są odpowiedniki PowerShell Bash && i || operatorzy?
Gilles 'SO - przestań być zły'
Ciekawym pytaniem jest, czy można użyć metaprogramowania programu PowerShell w celu zapewnienia tej funkcji przy użyciu&&
soandos,

Odpowiedzi:

35

&Operator w PowerShell jest tylko ;lub średnikiem.

&&Operator w PowerShell ma być uruchamiany jako ifoświadczenia.

Command ; if($?) {Command}

SS4Soku
źródło
1

Wypróbuj tę funkcję, której można używać mniej więcej w ten sam sposób:

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

Teraz &&można go zastąpić ; aa, który choć wciąż nie jest idealny, jest o wiele bardziej zwięzły.

cls && build

staje się

cls; aa build
mopsled
źródło
1
Jakiś nie-stylistyczny powód, którego używasz, args[0]a nie function aa ($cmd)?
ruffin
Jest to kruchy sposób wywoływania poleceń; używaj bloków skryptów, aby przekazywać polecenia i wywoływać je za pomocą ., nie &, ponieważ ten ostatni tworzy zakres potomny dla zmiennych.
mklement0