【问题标题】:Cannot run same script twice in same PowerShell session不能在同一个 PowerShell 会话中两次运行同一个脚本
【发布时间】:2017-07-18 15:52:31
【问题描述】:

我正在编写一个 PowerShell 脚本,它将打开一个应用程序,运行一个进程,然后关闭它,然后打开另一个应用程序,运行一个进程,然后关闭它。 (最终不止两个,但我从小处着手。)

我可以毫无问题地运行以下脚本:

# Project Config
$projectName = "c:\temp\test3.egp"
$projectName2= "c:\temp\test4.egp"

# Start Enterprise Guide
$app = New-Object -ComObject SASEGObjectModel.Application.7.1

#Open the Enterprise Guide Project
$projectObject = $app.Open($projectName, "")

# Save the Enterprise Guide Project
$projectObject.Save()

# Close the Enterprise Guide Project
$projectObject.Close()

# Open the second project
$projectObject = $app.Open($projectName2, "")

# Save the second project
$projectObject.Save()

#Close the second project
$projectObject.Close()

# Quit Enterprise Guide
$app.Quit()

PS C:\temp> ./test.ps1
PS C:\temp>

但是,如果我在上述提示符下第二次运行它,而不退出 PowerShell,则会出现错误。

PS C:\temp> ./test.ps1
Exception calling "Open" with "2" argument(s): "Path is not a directory 'C:': The filename, directory name, or volume label syntax is incorrect."
At C:\temp\test.ps1:9 char:27
    + $projectObject = $app.Open <<<< ($projectName, "")
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation
... more errors related to $projectObject not having a value, and then a second copy of each of these for the second attempt ... 

PS C:\temp>

如果我退出 Powershell,然后重新打开 Powershell,然后再次运行,它会正常工作。

记录的限制主要包括一次只能打开一个项目;但是,显然$projectObject.Close() 工作正常,因为它确实成功地运行了两个合一的脚本。只有当我离开脚本并再次运行它时才会出现问题。

现在,如果我删除$app.Quit(),它然后允许我在同一个会话中再次运行它;但我确实想退出应用程序(以确保脚本的任何后续运行都不会受到我刚刚所做的任何事情的影响;这是一个编程环境,所以设置会话宏变量等可能会产生不良影响)。我也不完全明白为什么$app = New-Object ... 行没有创建应用程序的新实例(那么为什么之前运行的 $app 退出是相关的)?

PowerShell 中有什么地方我做错了吗?或者这仅仅是我使用的 API 的问题,我必须与 SAS(供应商)交谈?

【问题讨论】:

  • 这很奇怪。特别是因为我希望您的所有变量都仅具有脚本范围,因此一次运行不应该对另一次运行产生影响。我知道删除 $app.Quit() 似乎可以使它工作......但是当它被包含在内时,您是否验证过该应用程序完全正常?例如。通过任务管理器。由于错误与$projectName 相关,因此脚本开始或脚本结束附近的Write-Output 可能会产生更多信息。
  • 是的,我认为这是您必须向供应商询问的问题。
  • @gms0ulman 不幸的是,我无法判断。 Powershell 似乎在不同的用户 ID 下运行该应用程序,而且我没有查看所有用户进程的管理员权限。 (否则它不会直接暴露给任务管理器?)
  • 我确实确认两次运行脚本与在一个脚本中运行两个项目之间存在一些差异,因为它不会保留会话宏变量;所以也许我可以忽略$app.quit 而不必担心。不过还是很奇怪。
  • @JonathanBlaine 您可能想问一个新问题 - 这是很老的问题,并没有真正得到令人满意的答案,尽管我看到那天我注销后有一些 cmets 我没有'不解决问题。

标签: powershell sas enterprise-guide


【解决方案1】:

在您原来的 PS 会话中为每个项目创建一个新的 PS 会话:New-PSSession

更多详细信息和示例可以在 Microsoft 文档站点 here 上找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-21
    • 2013-08-23
    • 2022-01-23
    • 1970-01-01
    • 2019-10-28
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多