在脚本中使用Start-process运行函数

时间:2015-06-02 19:05:21

标签: powershell

我正在尝试初始化TON of PowerShell窗口,以帮助您快速完成扫描。每个窗口都需要不同的输入,我有一个数组变量给出输入。启动过程函数似乎有效,但如果我使用"它会给我未知的函数错误,当我使用'

时我绝对没有回复
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
}

我不明白为什么我会得到未知函数错误,但我相信我没有得到回应,因为变量不是全局变量,我已经将变量声明为全局但仍然没有运气。也许我错过了什么。感谢。

1 个答案:

答案 0 :(得分:0)

添加到Ansgar Wiechars'回答,有以下区别:

  • 乔布斯将开始新的流程,但会给你很多 用于运行多个实例,排队和获取数据的框架 背部。但是,为每个工作启动一个新流程的成本很高 视窗。
  • 启动一个新的Powershell窗口将至少与作业一样慢,但是会增加视觉元素的开销,并且难以将结果返回到调用过程
  • Runspaces可能会执行得更快,因为 它们在同一个进程中作为线程运行,而且更便宜 实例化,因为他们使用现有的进程块(这是一个 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