![将带引号的参数字符串传递给 PowerShell 中的 Start-Process](https://linux22.com/image/534215/%E5%B0%86%E5%B8%A6%E5%BC%95%E5%8F%B7%E7%9A%84%E5%8F%82%E6%95%B0%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%BC%A0%E9%80%92%E7%BB%99%20PowerShell%20%E4%B8%AD%E7%9A%84%20Start-Process.png)
我试图非常简单地运行一个可执行文件并将文件路径作为第一个参数传入。在 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 }
PowerShell 中 Start-Process cmdlet 的问题在于它使用字符串数组作为参数,因此路径被分解并作为单独的标记发送到可执行文件,或者实际上作为没有那些重要引号的字符串发送到可执行文件。
在我的 PowerShell 命令行中添加引号会强制对“$feed.FullName”进行字面处理。
双引号“”使 PowerShell 在参数列表中看不到任何内容。它告诉我“参数为 null 或为空。”
我认为这是一个已知的难题,并且从第一天起就有已知的解决方法。
谢谢
路加
更新和回应
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'.
答案1
怎么样:
Invoke-Expression "start import.exe '$($feed.FullName)'"
答案2
此命令对我有用:
import.exe '"C:\Some Path\With\Spaces.txt"'
确保将双引号嵌套在单引号内。
答案3
这类事情可以通过 cmdlet 来invoke-expression
解决
invoke-expression "import.exe `"C:\Some Path\With\Spaces.txt`""
反引号将被解释并应使用指定的字符串启动 import.exe。
答案4
呼唤操作系统命令电源外壳直接地。
例如:
cmd.exe /c start import.exe $myParameter