2016-04-18 43 views
6

Nie mogę osiągnąć podzielić „if” stan na wielu liniach w PowerShell Z uwag, patrz przykład:Jak podzielić „czy” stan na liniach multilinii z komentarzami

If (# Only do that when... 
    $foo # foo 
    -and $bar # AND bar 
) 
{ 
    Write-Host foobar 
} 

generuje to następujące błąd:

Missing closing ')' after expression in 'if' statement.

Dodawanie znaku ` nie działa:

If (` # Only do that when... 
    $foo ` # foo 
    -and $bar ` # AND bar 
) 
{ 
    Write-Host foobar 
} 

dostaję:

Unexpected token '` # foo' in expression or statement.

Jedynym sposobem znalazłem jest usunięcie komentarzy:

If (` 
    $foo ` 
    -and $bar ` 
) 
{ 
    Write-Host foobar 
} 

Ale jestem pewien PowerShell oferuje sposób, aby robić to, co inni obsługi języków skryptowych: ja po prostu nie mogę go znaleźć ...

+0

Chciałbym przenieść '-and' do' $ foo' z '$ bar'. – PetSerAl

Odpowiedz

5

PowerShell automatycznie zawija linie po rozpoznaniu niekompletnego wyciągu. W przypadku operacji porównania jest to przypadek, gdy na przykład napisać wiersz o zwisające operatora:

if (# Only do that when... 
    $foo -and # foo AND 
    $bar  # bar 
)

Inaczej PowerShell będzie analizować te dwie linie jak dwóch różnych sprawozdań (bo pierwsza linia jest poprawnym wyrażeniem przez siebie) i kończy się niepowodzeniem na drugim, ponieważ jest nieważny. Dlatego musisz uciec od wybuchu linii.

Po prostu umieszczenie postaci ucieczki gdzieś w linii nie zadziała, ponieważ będzie to uciec od następnej postaci i pozostawić nietkniętą linię.


             
  
    $foo ` # foo 
  

Umieszczenie go na końcu wiersza z komentarzem (linia) również nie będzie działać, ponieważ komentarz ma pierwszeństwo, zamieniając znak ucieczki w dosłownym charakterem.


             
  
    $foo # foo` 
  

Jeśli chcesz uciec linebreaks musisz albo przesunąć komentarz w innym miejscu:

if (
    # Only do that when foo AND bar 
    $foo ` 
    -and $bar 
) 

lub wykorzystanie bloku komentarze jak @Chard zasugerował:

if (# Only do that when... 
    $foo  <# foo #> ` 
    -and $bar <# AND bar #> 
) 

ale szczerze mówiąc, moje zalecenie jest przeniesienie operatora na koniec poprzedniej linii i uniknięcie kłopotów z ucieczką od linii.

1

Możesz użyć komentarzy blokowych <# Your Comment #>, aby to zrobić.

If (<# Only do that when... #> ` 
    $foo <# foo #> ` 
    -and $bar <# AND bar #> 
) 
{ 
    Write-Host foobar 
} 
0

To wydaje się działać:

if (# Only do that when... 
    ($foo)-and # foo AND 
    ($bar)  # bar 
) 
{Write-Host 'foobar'}