Passar cadeia de argumento citada para Start-Process no PowerShell

4

Estou tentando simplesmente executar um executável e passar um caminho de arquivo como o primeiro argumento. No DOS, este seria o comando:

import.exe "C:\Some Path\With\Spaces.txt"

Ao colocar o caminho entre aspas, o caminho é analisado corretamente como o primeiro token no executável.

No PowerShell, estou usando isso:

$feeds = dir 'T:\Documents\Company\Product Development\Data
foreach ($feed in $feeds) { start -FilePath import.exe -ArgumentList $feed.FullName }

O problema com o cmdlet Start-Process no PowerShell é que ele usa uma matriz de string para argumentos, portanto, o caminho é dividido e enviado para o executável como tokens separados ou efetivamente como uma string sem essas aspas importantes.

Adicionando aspas à minha força de linha de comando do PowerShell "$ feed.FullName" para ser tratada literalmente.

As aspas duplas "" fazem com que o PowerShell não veja nada na lista de argumentos. "O argumento é nulo ou vazio." isso me diz.

Espero que esta seja uma dor de cabeça conhecida e tenha uma solução conhecida desde o primeiro dia.

Obrigado

Luke

ATUALIZAÇÕES E RESPOSTAS

foreach ($feed in $feeds) { Invoke-Expression "start import.exe '"$feed.FullName'"" }

Nota: Estou usando o Start, pois, apesar de definir meu local para a pasta em que o import.exe reside, o PowerShell parece ter sido escrito para procurar executáveis no local atual do sistema de arquivos.

A variável é interpretada com o .FullName como uma string literal!:

filename.txt.FullName

Este aqui:

foreach ($feed in $feeds) { Invoke-Expression "C:\Users\Public\Documents\~Main\Data.Importer\Data.Importer\bin\Release\import.exe ($feed.FullName)" }

Resultados em:

Invoke-Expression : Unexpected token '_data.txt.FullName' in expression or statement.

Curiosamente, por si só, isso funciona:

C:\Users\Public\Documents\~Main\Data.Importer\Data.Importer\bin\Release\import.exe $feed.FullName

Mas isso:

foreach ($feed in $feeds) { Invoke-Expression C:\Users\Public\Documents\~Main\Vuplan\Evoq.Vuplan.Data.Epg.Importer\Evoq.Vuplan.Data.Epg.Importer\bin\Release\import.exe $feed.FullName }

Resultados disso:

Invoke-Expression : A positional parameter cannot be found that accepts argument 'T:\Documents\Company\Product Development\Data12_data.txt'.
    
por Luke Puplett 28.12.2010 / 20:49

5 respostas

2

Que tal:

Invoke-Expression "start import.exe '$($feed.FullName)'"
    
por 29.12.2010 / 13:05
3

Este comando funciona para mim:

import.exe '"C:\Some Path\With\Spaces.txt"'

Certifique-se de aninhar as aspas duplas entre aspas simples.

    
por 29.12.2010 / 13:12
1

Esse tipo de coisa pode ser contornado com o invoke-expression cmdlet

invoke-expression "import.exe '"C:\Some Path\With\Spaces.txt'""

Os backticks serão interpretados e devem iniciar o import.exe com a string especificada.

    
por 28.12.2010 / 21:21
1

Após atribuir todos os caminhos às variáveis, o comando Start-Process pode ser usado assim:

Start-Process -NoNewWindow -FilePath $toolPath -ArgumentList '"$arg1'",'"$arg2'"

Ao usar '"os argumentos são passados para o aplicativo, por exemplo: Captura de tela de um exemplo

    
por 13.07.2018 / 09:19
0

Chamando comandos DOS diretamente no PowerShell .

Por exemplo:

cmd.exe /c start import.exe $myParameter
    
por 05.07.2016 / 09:21

Tags