Powershell脚本:使用“like$Arg=“$somePath”传递参数应导致“c:\temp\”包括

Powershell脚本:使用“like$Arg=“$somePath”传递参数应导致“c:\temp\”包括,powershell,parameters,escaping,double-quotes,external-script,Powershell,Parameters,Escaping,Double Quotes,External Script,这是我关于stackoverflow的第一个问题,所以请对我放轻松 问题: 从Powershell脚本调用外部EXE文件应如下所示 C:\temp\someEXE.exe "batch" "B:\some path with spaces\file name with spaces.jpg" "" "C:\some other path" $Arguments = '"batch"', &quo

这是我关于stackoverflow的第一个问题,所以请对我放轻松

问题: 从Powershell脚本调用外部EXE文件应如下所示

C:\temp\someEXE.exe "batch" "B:\some path with spaces\file name with spaces.jpg" "" "C:\some other path"
$Arguments = '"batch"', "$Originalpath", '""', "$Outpath\$Outfile"
Start-Process -Wait -FilePath "C:\Temp\SomeExe.exe" -ArgumentList "$Arguments"
ps1脚本中的$Arguments变量如下所示

C:\temp\someEXE.exe "batch" "B:\some path with spaces\file name with spaces.jpg" "" "C:\some other path"
$Arguments = '"batch"', "$Originalpath", '""', "$Outpath\$Outfile"
Start-Process -Wait -FilePath "C:\Temp\SomeExe.exe" -ArgumentList "$Arguments"
参数1和参数3,空的可以与“”single-double-double-single一起使用

但是,当我使用“$Variable”单变量时,它不会根据引用规则进行解释

所以我的问题是: 如何从$Originalpath到B:\some path with spaces\file name with spaces.jpg包括

先谢谢你

更新: 当我添加一行将参数写入日志文件时,这一行提供了我所需要的

Write-output '"batch"',`"$Original`",'""',`"$AIAusgabepfad\$Originaldatei$Originaltyp`" | Out-file C:\Temp\Startup.log -append
但是,当我尝试以相同的方式删除$Arguments时,scriptwindow会弹出并在同一秒钟内消失。

通常: 要同步执行控制台应用程序或批处理文件,请直接调用它们C:\temp\someEXE.exe…,不要使用启动过程-请参阅并详细说明适当和不适当的用例,并请求将指导添加到帮助主题中

也就是说,请注意,从PowerShell 7.1开始,传递空字符串参数是不正确的,需要解决方法“”

类似地,使用嵌入字符传递参数。如中所述,也已损坏

中正在讨论选择加入修复,但请注意,如果您选择加入该修复,旧的解决方法将被打破

如果您确实需要使用:

虽然-ArgumentList参数是数组类型的[string[],允许您单独传递参数(您已经尝试利用了这一点),但遗憾的是,如果单独传递的参数包含嵌入的空格,则Start Process无法正确处理这些参数,请参见,因此,可靠的解决方案是使用一个包含所有参数的单参数列表参数,并嵌入双引号,如有必要,请参阅以获得更详细的讨论

Start-Process -Wait -FilePath "C:\Temp\SomeExe.exe" -ArgumentList `
  "batch `"$Originalpath`" `"`" `"$Outpath\$Outfile`""

请注意,这种传递参数的方法(作为一个带有嵌入引号和转义的单个字符串传递给启动进程ArgumentList)不受困扰直接调用的bug的影响:结果字符串会像在Windows上一样传递给进程。

感谢您提供了正确的方向。我需要启动进程,因为我需要-wait选项来限制并发运行的数量。我试图直接传递参数,而不是通过$arguments变量传递参数。这是我现在使用的版本。启动进程-等待-文件路径C:\Temp\SomeEXE.exe-参数列表“批处理”,“原始路径”,“输出路径”\$Outfile@J是的,如果应用程序是GUI子系统应用程序,则需要启动进程-等待与控制台子系统应用程序同步执行,默认情况下调用是同步的。如果references变量中包含的任何值包含空格(答案链接到的bug),则显示的命令将中断-如答案中所示,将所有内容作为带有嵌入引号的单个ArgumentList参数传递,以避免出现这种情况。