Я пытаюсь очень просто запустить исполняемый файл и передать путь к файлу в качестве первого аргумента. В DOS это была бы команда:
import.exe "C:\Some Path\With\Spaces.txt"
Помещая путь в кавычки, путь правильно анализируется как первый токен в исполняемом файле.
В PowerShell я использую это:
$feeds = dir 'T:\Documents\Company\Product Development\Data
foreach ($feed in $feeds) { start -FilePath import.exe -ArgumentList $feed.FullName }
Проблема с командлетом Start-Process в PowerShell заключается в том, что он использует массив строк для аргументов, поэтому путь разбивается и отправляется исполняемому файлу в виде отдельных токенов или фактически в виде строки без этих важных кавычек.
Добавление кавычек в мою командную строку PowerShell заставляет "$ feed.FullName" трактоваться буквально.
А двойные кавычки "" заставляют PowerShell ничего не видеть в списке аргументов. «Аргумент пустой или пустой». это мне говорит.
Я полагаю, что это известная головная боль, и с первого дня у нее был известный обходной путь.
Спасибо
Люк
ОБНОВЛЕНИЯ И ОТВЕТЫ
foreach ($feed in $feeds) { Invoke-Expression "start import.exe `"$feed.FullName`"" }
Примечание. Я использую «Пуск», поскольку, несмотря на то, что я указывал местоположение в папке, в которой находится import.exe, похоже, что PowerShell был написан для поиска исполняемых файлов в текущем местоположении файловой системы.
Переменная интерпретируется с .FullName как буквальная строка !:
filename.txt.FullName
Вот этот:
foreach ($feed in $feeds) { Invoke-Expression "C:\Users\Public\Documents\~Main\Data.Importer\Data.Importer\bin\Release\import.exe ($feed.FullName)" }
Результаты в:
Invoke-Expression : Unexpected token '_data.txt.FullName' in expression or statement.
Интересно, что это работает само по себе:
C:\Users\Public\Documents\~Main\Data.Importer\Data.Importer\bin\Release\import.exe $feed.FullName
Но это:
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 }
Результатов в этом:
Invoke-Expression : A positional parameter cannot be found that accepts argument 'T:\Documents\Company\Product Development\Data\3112_data.txt'.
У меня работает эта команда:
import.exe '"C:\Some Path\With\Spaces.txt"'
Убедитесь, что вы вложили двойные кавычки в одинарные.
Как насчет:
Invoke-Expression "start import.exe '$($feed.FullName)'"
После присвоения всех путей переменным Start-Process
команду можно использовать так:
Start-Process -NoNewWindow -FilePath $toolPath -ArgumentList `"$arg1`",`"$arg2`"
При использовании `" аргументы передаются приложению в кавычках, то есть: Скриншот примера
Подобные вещи можно обойти с помощью invoke-expression
командлет
invoke-expression "import.exe `"C:\Some Path\With\Spaces.txt`""
Обратные кавычки будут интерпретированы и должны запустить import.exe с указанной строкой.
Вызов ДОС команды в Powershell прямо.
Например:
cmd.exe /c start import.exe $myParameter