Start-Process不解析参数列表

时间:2015-06-09 08:24:55

标签: powershell powershell-ise

我创建了一个PowerShell脚本,但出于某种原因,“Start-Process”-cmdlet似乎没有正常运行。这是我的代码:

[string]$ListOfProjectFiles = "project_file*."
[string]$arg   = "project_file"
[string]$log   = "C:\Work\output.log"
[string]$error = "C:\Work\error.log"

Get-ChildItem $PSScriptRoot -filter $ListOfProjectFiles | `
    ForEach-Object {
        [string]$OldFileName = $_.Name
        [string]$Identifier = ($_.Name).Substring(($_.Name).LastIndexOf("_") + 1)

        Rename-Item $PSScriptRoot\$_ -NewName "project_file"

        Start-Process "$PSScriptRoot\MyExecutable.exe" ` #This line causes my headaches.
                        -ArgumentList $arg `
                        -RedirectStandardError $error `
                        -RedirectStandardOutput $log `
                        -Wait
        Remove-Item "C:\Work\output.log", "C:\Work\error.log"

        Rename-Item "$PSScriptRoot\project_file" -NewName $OldFileName
        }

主要问题是,在我的机器上程序运行,但只有在我添加了-Wait开关之后。我发现如果我在PowerShell-ISE中执行我的代码,MyExecutable.exe 确实识别参数并正确运行程序,而如果我只运行没有断点的脚本,它会错误,好像它无法解析$arg值。添加-Wait开关似乎解决了我机器上的问题。

在我的同事的机器上,MyExecutable.exe无法识别-ArgumentList $arg部分的输出:它只是退出时出现错误,指出所需的参数(应为"project_file")无法找到。

我试图对"project_file"部分进行硬编码,但这并不成功。我一直在玩Start-Process - cmdlet的其他开关,但没有任何效果。我有点不知所措,对PowerShell来说还是一个新手,但完全混淆了为什么它在不同的计算机上表现不同。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

如果您不使用-Wait切换,那么您的脚本会在MyExecutable.exe仍在执行时继续运行。特别是在编程打开文件之前,您可以重命名文件(Rename-Item "$PSScriptRoot\project_file" -NewName $OldFileName)。

您将普通project_file作为参数传递给您的程序。如果当前工作目录不是$PSScriptRoot怎么办?除了当前工作目录之外,MyExecutable.exe是否设计用于在exe位置目录中查找文件?我建议改为提供完整路径:

[string]$arg   = "`"$PSScriptRoot\project_file`""

不要只将FileInfoDirectoryInfo个对象转换为字符串。它不保证返回完整路径或只返回文件名。根据您的需要明确询问NameFullName属性值。

Rename-Item $_.FullName -NewName "project_file"