将带引号的参数字符串传递给 PowerShell 中的 Start-Process

Luk*_*ett 5 powershell

我试图非常简单地运行一个可执行文件并传递一个文件路径作为第一个参数。在 DOS 中,这将是命令:

import.exe "C:\Some Path\With\Spaces.txt"
Run Code Online (Sandbox Code Playgroud)

通过将路径放在引号中,路径将被正确解析为可执行文件中的第一个标记。

在 PowerShell 中我使用这个:

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

PowerShell 中 Start-Process cmdlet 的问题在于它使用字符串数组作为参数,因此路径被分解并作为单独的标记发送到可执行文件,或者有效地作为不带这些重要引号的字符串发送到可执行文件。

在我的 PowerShell 命令行中添加引号会强制按字面意思处理“$feed.FullName”。

双引号 "" 使 PowerShell 在参数列表中看不到任何内容。“参数为空或为空。” 它告诉我。

我预计这是一个已知的令人头疼的问题,并且从第一天起就有已知的解决方法。

谢谢

卢克

更新和回应

foreach ($feed in $feeds) { Invoke-Expression "start import.exe `"$feed.FullName`"" }
Run Code Online (Sandbox Code Playgroud)

注意:我使用“开始”,因为尽管将我的位置设置为 import.exe 所在的文件夹,但 PowerShell 似乎已被编写为在文件系统当前位置查找可执行文件。

该变量被解释为 .FullName 作为文字字符串!:

filename.txt.FullName
Run Code Online (Sandbox Code Playgroud)

这个:

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

结果是:

Invoke-Expression : Unexpected token '_data.txt.FullName' in expression or statement.
Run Code Online (Sandbox Code Playgroud)

有趣的是,它本身是有效的:

C:\Users\Public\Documents\~Main\Data.Importer\Data.Importer\bin\Release\import.exe $feed.FullName
Run Code Online (Sandbox Code Playgroud)

但是这个:

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 }
Run Code Online (Sandbox Code Playgroud)

结果如下:

Invoke-Expression : A positional parameter cannot be found that accepts argument 'T:\Documents\Company\Product Development\Data\3112_data.txt'.
Run Code Online (Sandbox Code Playgroud)

小智 2

怎么样:

Invoke-Expression "start import.exe '$($feed.FullName)'"
Run Code Online (Sandbox Code Playgroud)