【问题标题】:Run function with Start-process within script在脚本中使用 Start-process 运行函数
【发布时间】:2015-06-02 19:05:20
【问题描述】:

我正在尝试初始化大量的 powershell 窗口以帮助快速完成扫描。每个窗口都需要不同的输入,我有一个数组变量提供该输入。 start-process 功能似乎可以工作,但是如果我使用",它会给我未知的功能错误,并且在我使用' 时绝对没有响应

foreach($search in $Partlist){
    start-process powershell.exe -argumentlist '-nologo -noprofile -executionpolicy bypass -command .\Get-Data -search $search -department $PNdept -accuracy $accuracy; pause'
    start-sleep -s 5
}

我不明白为什么会出现未知函数错误,但我相信我没有得到任何响应,因为变量不是全局变量,我已将变量声明为全局变量,但仍然没有运气。也许我错过了一些东西。谢谢。

【问题讨论】:

  • 什么是Get-Data?脚本还是函数?它看起来像脚本的路径,在这种情况下尝试使用完整路径,因为除非您将 WorkingDirectory 参数传递给 Start-Process,否则新进程不会在当前目录中启动。
  • 我建议您开始研究jobs
  • 写完整路径的问题是它需要用引号引起来,因为路径名中有空格。它也是一个脚本,但我有点把它变成了一个函数,因为它需要输入。我现在正在找工作。

标签: powershell


【解决方案1】:

要添加到 Ansgar Wiechars 的答案,有以下区别:

  • 作业将在后台启动新流程,但会为您提供很多 用于运行多个实例、排队和获取数据的框架 背部。但是,为每个作业启动一个新流程的成本很高 窗户。
  • 启动一个新的 Powershell 窗口至少会像作业一样慢,但会增加视觉元素的开销,并且很难将结果返回给调用进程
  • 运行空间可能会执行得更快,因为 它们在同一进程中作为线程运行,这要便宜得多 实例化,因为它们使用现有的进程块(这是一个 Windows 结构,而不是 PS 结构)。

这里有一篇很棒的文章:https://learn-powershell.net/2012/05/13/using-background-runspaces-instead-of-psjobs-for-better-performance/,但请注意不要太过分:https://newsqlblog.com/2012/05/22/concurrency-in-powershell-multi-threading-with-runspaces/

为了回答您关于全局空间的观点,这对于您所坐的计算机的桌面会话不是全局的。这对于您正在使用的 powershell 进程是全局的。示例:您使用以下内容创建环境变量:

[System.Environment]::SetEnvironmentVariable("MyVar", 22, "User")

你生成一个新的 powershell 窗口并用这个检查它:

$env:MyVar

你用这个删除它:

Remove-Item env:\myvar

您生成了另一个新的 powershell 窗口,并且环境变量仍然存在。进一步的实验将向您展示每个新进程都会产生一个新的全局范围。

所以!为什么会出现“未知功能”?因为您希望环境的某些方面与调用过程相匹配,但它并不成立。在这种情况下:

  • 您的命令不在生成新进程的路径中
  • 您的变量值未分配,因为您在单引号中传递它们并且新进程没有它们在范围内

使用运行空间,或参考:PowerShell Executing a function within a Script Block using Start-Process does weird things with double quotes

【讨论】:

    猜你喜欢
    • 2019-07-26
    • 2019-03-25
    • 2021-04-28
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    相关资源
    最近更新 更多