我创建了一个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来说还是一个新手,但完全混淆了为什么它在不同的计算机上表现不同。
我做错了什么?
答案 0 :(得分:1)
如果您不使用-Wait
切换,那么您的脚本会在MyExecutable.exe
仍在执行时继续运行。特别是在编程打开文件之前,您可以重命名文件(Rename-Item "$PSScriptRoot\project_file" -NewName $OldFileName
)。
您将普通project_file
作为参数传递给您的程序。如果当前工作目录不是$PSScriptRoot
怎么办?除了当前工作目录之外,MyExecutable.exe
是否设计用于在exe位置目录中查找文件?我建议改为提供完整路径:
[string]$arg = "`"$PSScriptRoot\project_file`""
不要只将FileInfo
或DirectoryInfo
个对象转换为字符串。它不保证返回完整路径或只返回文件名。根据您的需要明确询问Name
或FullName
属性值。
Rename-Item $_.FullName -NewName "project_file"