Posso fazer com que o&& trabalhe no Powershell?


186

&&é notoriamente difícil de pesquisar no google, mas o melhor que encontrei é este artigo que diz usar -and.

Infelizmente, ele não fornece mais informações e não consigo descobrir o que devo fazer -and(novamente, uma coisa notoriamente difícil de procurar)

O contexto em que estou tentando usá-lo é "execute cmd1 e, se for bem-sucedido, execute cmd2", basicamente este:

csc /t:exe /out:a.exe SomeFile.cs && a.exe

Esse deve ser um ponto fácil para alguns que sabem, obrigado!


Edit: Se você apenas deseja executar vários comandos em uma única linha e não se importa se o primeiro falha ou não, você pode usá-lo. ;Para a maioria dos meus objetivos, tudo bem.

Por exemplo: kill -n myapp; ./myapp.exe.


O PowerShell possui operadores lógicos. Os operadores não estão funcionando da maneira que você espera? Nesse caso, você pode postar a expressão aqui.
— Mohit Chakraborty

Veja esta questão, ele faz o que quiser: stackoverflow.com/questions/1917271/...
— joshperry

2
Quem estiver interessado no estilo Bash &&e ||se tornar parte do PowerShell: vote no recurso aqui .
— precisa saber é o seguinte

1
Com relação à necessidade de realizar pesquisas na web para consultas com símbolos literais (e significativos): SymbolHound é útil para isso. Aqui estão alguns exemplos que dizem respeito à pergunta: PowerShell && ; PowerShell - e . Se você usa o DuckDuckGo , pode pesquisar no SymbolHound via !sym.
— Nisavid

3
Atualização de junho de 2019 : a equipe do PowerShell está implementando &&e ||! Pesar no PR
— pilau

Respostas:


193

No CMD, '&&' significa "execute o comando 1 e, se for bem-sucedido, execute o comando 2". Eu o usei para coisas como:

build && run_tests

No PowerShell, a coisa mais próxima que você pode fazer é:

(build) -and (run_tests)

Tem a mesma lógica, mas o texto de saída dos comandos é perdido. Talvez seja bom o suficiente para você.

Se você estiver fazendo isso em um script, provavelmente será melhor separar as instruções, assim:

build
if ($?) {
    run_tests
}

27/11 2019 : o &&operador já está disponível para o PowerShell 7 Preview 5+ :

PS > echo "Hello!" && echo "World!"
Hello!
World!

2
RE: "ridículo que eles removessem" - não gosto de pensar no PowerShell como "CMD com as partes estúpidas removidas". is.gd/k92B
— Jay Bazuzi

90
Não gosto de pensar no PowerShell como "CMD com as partes estúpidas removidas". Eu gosto de pensar nisso como "Bash sem nenhum dos bits úteis".
— Pod

15
Você também pode fazer build ; if ($?) { run_tests }na linha de comando.
— docwhat

19
A maneira mais rápida de frustração real ao aprender o PowerShell é começar pensando que é apenas um CMD expandido ou uma festa. Ele tem um modelo fundamentalmente diferente, especialmente quando se trata de entrada, saída, tubulação e resultados. Comece com um bom tutorial ou visão geral e não tente fazer com que a sintaxe de outros shells funcione. Você tem que tomar em seus próprios termos.
— Mark Meuer

3
Tomando o PowerShell em seus próprios termos, como executo um comando e, somente se esse comando for bem-sucedido, execute outro comando? Eu não acho que isso imponha bashidéias no PowerShell. É a funcionalidade básica do shell. Até agora, o melhor que vi é o build ; if ($?) { run_tests }que vou usar a partir de agora. Espero que a equipe do PowerShell adicione &&suporte!
— Nate

28

&& e || estavam na lista de itens a serem implementados (ainda estão), mas não apareceram como a próxima coisa mais útil a ser adicionada. O motivo é que temos -AND e -OR. Se você acha que é importante, envie uma sugestão no Connect e a consideraremos para a V3.


11
Eu me inscrevi no Connect e me nomeei para o PowerShell, mas não consigo descobrir como fazer uma sugestão. O site do Connect é realmente complexo e confuso :-(
— Orion Edwards

6
Eu não poderia encontrar uma solicitação pré-existente, então eu fiz um: connect.microsoft.com/PowerShell/feedback/details/778798/...
— Andy Arismendi

22
Você sabe, a questão ainda é como escrever um equivalente, e sua resposta seria muito mais útil se você adicionou um exemplo de utilização -AND
— Kyeotic

5
É importante porque é uma ferramenta básica de controle de fluxo usada em sistemas mais antigos que o Windows por quase eternidade. Assim está presente ainda outra diferença entre o linux e o windows.
— Airtonix

6
Espero que Jeffrey Snover esteja ouvindo, esse SO deve ser motivo suficiente para implementá-lo agora. Faz muito tempo e agora o PowerShell começa a aparecer em alguns lugares, como o VSCode o usa como um terminal padrão no Windows. É uma dor total sem &&, -ando resultado é o resultado, não equivalente.
— Ciantic # 14/17

13

Tente o seguinte:

$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe

9
Nota: Se o primeiro comando falhar, o segundo ainda será executado.
— BrunoLM 25/05

4
A variável de preferência $ErrorActionPreferencecontrola apenas como os erros não terminados relatados pelos cmdlets são tratados; utilitários externos como csce a.exenunca relatam esses erros (eles refletem apenas o status de saída em $?(sinalizador de sucesso) e $LASTEXITCODE(o código de saída específico relatado)); portanto, sua linha de comando equivale à execução incondicional de ambos os comandos (o equivalente a cmd's csc /t:exe /out:a.exe SomeFile.cs & a.exe)
— mklement0

5

Se seu comando estiver disponível no cmd.exe (algo como, python ./script.pymas não no PowerShell, como ii .(Isso significa abrir o diretório atual pelo explorer)), você poderá executar o cmd.exe no PowerShell. A sintaxe é assim:

cmd /c "command1 && command2"

Aqui, &&é fornecido pela sintaxe cmd descrita nesta pergunta .


4
Bom, atualize para o cmd para acessar sua funcionalidade adicional.
— Bill K

4

Eu tentei esta sequência de comandos no PowerShell:

Teste de Fisrt

PS C:\> $MyVar = "C:\MyTxt.txt"
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
True

($MyVar -ne $null)retornou verdadeiro e (Get-Content $MyVar)também retornou verdadeiro .

Segundo teste

PS C:\> $MyVar = $null
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
False

($MyVar -ne $null)retornou false e até agora devo assumir que (Get-Content $MyVar)também retornou false .

O terceiro teste comprovou que a segunda condição nem sequer foi analisada.

PS C:\> ($MyVar -ne $null) -and (Get-Content "C:\MyTxt.txt")
False

($MyVar -ne $null)retornou false e provou que a segunda condição (Get-Content "C:\MyTxt.txt")nunca foi executada, retornando false em todo o comando.


Você está certo! isso se comporta como o operador &&. Mesmo um $ () no lado direito não permitirá avaliar isso!
— Falco Alexander

2

Pergunta muito antiga, mas para os novatos: talvez a versão do PowerShell (semelhante, mas não equivalente ) que a pergunta está procurando, seja a -andseguinte:

(build_command) -and (run_tests_command)


1
Isso pode ser bom para o seu caso de uso, mas não está se comportando assim &&, pois ignora o código de saída de build_command.
— 22619 Simon Buchan

Definitivamente, isso não está fazendo a coisa correta. Ele executará o segundo comando, mesmo que o primeiro falhe.
— Nate

isso está completamente errado. ;é o equivalente &em cmd e ;em bash. Definitivamente não é o mesmo que &&no cmd
— phuclv

Também silencia STDOUT e STDERR para ambos os processos.
— Dragas 24/06

0

Depende do contexto, mas aqui está um exemplo de "-e" em ação:

get-childitem | where-object { $_.Name.StartsWith("f") -and $_.Length -gt 10kb }

Portanto, está obtendo todos os arquivos maiores que 10kb em um diretório cujo nome de arquivo começa com "f".


1
Esta não é uma resposta para a pergunta original, que consiste em executar vários comandos.
— bdukes

0
if (start-process filename1.exe) {} else {start-process filename2.exe}

É um pouco mais longo que "&&", mas realiza a mesma coisa sem scripts e não é muito difícil de lembrar. Antes tarde do que nunca. :)


2
Start-Processé a ferramenta errada a ser usada para chamar utilitários de linha de comando em geral. Especificamente, conforme usado aqui, Start-Processé executado de filename1.exeforma assíncrona em uma nova janela do console e não retorna nada , que é avaliado em um contexto booleano $false. Mesmo que você o tenha omitido Start-Process(e é assim que você deve chamar os utilitários de linha de comando - diretamente), a abordagem será insuficiente, porque o resultado da condicional depende se o utilitário produziu alguma saída stdout, que não tem relação garantida conseguiu ou não.
— precisa saber é o seguinte

0

Eu acho que uma declaração simples se pode conseguir isso. Depois que vi a resposta de mkelement0 acima desse último status de saída é armazenada em $?, Juntei o seguinte:

# Set 1st command to variable
$a=somecommand

# Temp var to store exit status of last command (since we can't write to $?)
$test=$?

# Run Test
if ($test=$true) { 2nd-command }

Portanto, para o exemplo do op, seria:

a=(csc /t:exe /out:a.exe SomeFile.cs); $test = $?; if ($test=$true) { a.exe }

0

Um equivalente detalhado é combinar $LASTEXITCODEe -eq 0:

msbuild.exe args; if ($LASTEXITCODE -eq 0) { echo 'it built'; } else { echo 'it failed'; }

Não sei por if ($?)que não funcionou para mim, mas este funcionou.


-1

Podemos tentar este comando em vez de usar o método &&

tente {hostname; if ($ lastexitcode -eq 0) {ipconfig / all | findstr / i bios}} pegue {echo err} finalmente {}


Não há necessidade de try/ catch, porque é necessário apenas para encerrar erros, que utilitários externos, como hostname, ipconfige findstrnão podem disparar. A verificação $LASTEXITCODEé necessária apenas se você quiser conhecer o código de saída específico definido por um utilitário externo - o sucesso ou falha abstrata é refletida $?, assim como nos cmdlets nativos.
— usar o seguinte comando

Acho que a @Cyberiron está no caminho certo. Eu acho que &&no Unix é muito parecido com try / catch, pois não exige que você agrupe comandos subsequentes em um novo bloco (ou seja }) quando você executa um curto-circuito nos comandos posteriores (ignore-os). Eu acho que uma AmpAmpfunção / filtro que lança quando if (!?) { throw "last command failed" }seria um substituto muito útil para portar &&para o PowerShell. uso :csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe
— yzorg 20/12/18
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.