我目前正在尝试将一系列批处理文件转换为powershell脚本。我想以递归方式为目录中存在的源文件运行编译器。编译器需要一长串参数。问题是,我希望参数是可变的,所以我可以根据需要更改它们。这是来自批处理文件的典型调用(为了可读性和长度而简化):
“C:\ PICC Compilers \ picc18.exe”--pass1 “C:\ Src Files \ somefile.c” “-IC:\ Include Files”“ - IC:\ Header 文件“-P --runtime =默认值,+清晰,+初始化,-keep,+下载+ stackwarn,-config,+ CLIB,-plib --opt = default,+ asm,-speed,+ space,9 --warn = 0 --debugger = realice -Blarge --double = 24 --cp = 16 -g --asmlist“--errformat = Error [ %n]%f;%l。%c %s“” - msgformat =咨询[%n]%s“ - OBJDIR =”C:\ Built Files“ “--warnformat =警告[%n]%f;%l。%c%s”
当包含在批处理文件中时,此命令执行正常,但是当我将命令复制并粘贴到PowerShell中时,我开始收到错误。这只是我第二天使用PowerShell,但我过去使用.NET开发。我设法凑合了以下尝试:
$srcFiles = Get-ChildItem . -Recurse -Include "*.c"
$srcFiles | % {
$argList = "--pass1 " + $_.FullName;
$argList += "-IC:\Include Files -IC:\Header Files -P --runtime=default,+clear,+init,-keep,+download,+stackwarn,-config,+clib,-plib --opt=default,+asm,-speed,+space,9 --warn=0 --debugger=realice -Blarge --double=24 --cp=16 -g --asmlist '--errformat=Error [%n] %f; %l.%c %s' '--msgformat=Advisory[%n] %s' '--warnformat=Warning [%n] %f; %l.%c %s"
$argList += "--OBJDIR=" + $_.DirectoryName;
&"C:\PICC Compilers\picc18.exe" $argList }
我知道上面的代码可能存在多个问题,即如何传递参数以及如何处理参数列表中的引号。这是不正确的,它应该说明我想要实现的目标。关于从哪里开始的任何建议?
答案 0 :(得分:6)
从PowerShell调用命令行应用程序可能非常棘手。几个星期前,@ Jaykul写了一篇很棒的博客文章The problem with calling legacy/native apps from PowerShell,在那里他描述了人们在这种情况下会遇到的问题。当然也有解决方案;)
编辑 - 更正网址
该文章不再可用,因此只能通过web.archive.org查看 - 请参阅cached article
答案 1 :(得分:4)
使$arglist
成为数组而不是字符串。单个字符串将始终作为单个参数传递,这是您 想要的。