Execução de um arquivo EXE usando um script PowerShell

111

Estou tentando executar um arquivo EXE usando um script do PowerShell. Se eu usar a linha de comando, funcionará sem problemas (primeiro forneço o nome do executável e uma série de parâmetros para invocá-lo):

"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode

Mas fazer exatamente a mesma coisa dentro de um script retorna um erro:

O termo '"C: \ Arquivos de programas \ Automated QA \ TestExecute 8 \ Bin \ TestExecute.exe" C: \ temp \ TestProject1 \ TestProject1.pjs / run / exit / SilentMode' não é reconhecido como o nome de um cmdlet, função , arquivo de script ou programa operável. Verifique a grafia do nome ou, se um caminho foi incluído, verifique se o caminho está correto e tente novamente.

(Eu invoquei o comando usando o operador "&".)

Como posso resolver este problema?

Éden
fonte
4
Publique seu código, por favor. Já que é aí que está o problema, ter isso para olhar é muito mais fácil do que adivinhar.
Cody Gray

Respostas:

122
& "C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode

ou

[System.Diagnostics.Process]::Start("C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe", "C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode")

ATUALIZAÇÃO: desculpe, perdi "(invoquei o comando usando a frase" & "operador)". Tive esse problema quando estava avaliando o caminho dinamicamente. Experimente a construção Invoke-Expression:

Invoke-Expression "& `"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe`" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode"
Tomas Panik
fonte
Estranho que o comando na pergunta original, quase exatamente, funcione para mim em uma VM no PS2.0. Mas esse mesmo comando agora falha no sistema PS4.0. Curiosamente, estou chamando TestExecute também. Acho que gosto mais da opção 2, vou tentar, obrigado!
EJA
33

Parece que você está especificando o EXE e seu primeiro argumento em uma única string, por exemplo; '"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode'. Isso não vai funcionar. Em geral, você invoca um comando nativo que tem um espaço em seu caminho, assim:

& "c:\some path with spaces\foo.exe" <arguments go here>

Isso é &Espera ser seguido por uma string que identifica um comando: cmdlet, função, exe relativa nativa ou caminho absoluto.

Depois de fazer isso funcionar:

& "c:\some path with spaces\foo.exe"

Comece a trabalhar citando os argumentos conforme necessário. Embora pareça que seus argumentos devem estar bem (sem espaços, sem outros caracteres especiais interpretados pelo PowerShell).

Keith Hill
fonte
2
Existe alguma maneira de executar o script do PowerShell sem o caminho completo, se o script e exe estiverem na mesma pasta? Ou é possível usar um caminho relativo?
guanome
7
Se o exe estiver na mesma pasta, você pode fazer isso .\foo.exee também pode usar um caminho relativo ..\..\foo.exee um caminho relativo com espaços & '..\..\path with spaces\foo.exe'.
Keith Hill
Quando você tem tubos em seu comando que você deve usar aspas: cmd /c "C:\temp\strarc.exe -cjd:M:\ | C:\temp\strarc.exe -s:8 -xd:N:\".
larkee
2

No Powershell, faça cd para o local do arquivo .exe. Por exemplo:

cd C: \ Usuários \ Administradores \ Downloads

PS C: \ Usuários \ Administradores \ Downloads> & '. \ Aaa.exe'

O instalador aparece e segue as instruções na tela.

cara aleatório
fonte
exatamente o que eu quero! execute um arquivo .exe & '. \ aaa.exe'
Sharif Yazdian
2
  1. clone $ args
  2. empurre seus argumentos em uma nova matriz
  3. & $ path $ args

Demo:

$exePath = $env:NGINX_HOME + '/nginx.exe'
$myArgs = $args.Clone()

$myArgs += '-p'
$myArgs += $env:NGINX_HOME

& $exepath $myArgs
NoDocCat
fonte
Thx @nodoccat, funcionou perfeitamente para lançar um comando docker com uma lista muito longa de argumentos.
danidemi
1

Não sendo um desenvolvedor, encontrei uma solução ao executar vários comandos ps em uma linha. Por exemplo:

powershell "& 'c:\path with spaces\to\executable.exe' -arguments ; second command ; etc

Colocando um "(aspas duplas) antes do & (e comercial), ele executa o executável. Em nenhum dos exemplos que encontrei isso foi mencionado. Sem as aspas duplas, o prompt do ps é aberto e espera pela entrada.

RichardE
fonte
Olá, RichardE. Você pode melhorar a formatação de sua resposta? No modo de edição, a ajuda de formatação é fornecida, dê uma olhada nela.
Dorian Turba