Que tal:
Invoke-Expression "start import.exe '$($feed.FullName)'"
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'.
Este comando funciona para mim:
import.exe '"C:\Some Path\With\Spaces.txt"'
Certifique-se de aninhar as aspas duplas entre aspas simples.
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.
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
Chamando comandos DOS diretamente no PowerShell .
Por exemplo:
cmd.exe /c start import.exe $myParameter
Tags powershell