繁体   English   中英

在脚本中使用Start-process运行功能

[英]Run function with Start-process within script

我正在尝试初始化一堆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
}

我不明白为什么会收到未知的函数错误,但我相信我没有任何反应,因为变量不是全局变量,我已经声明了全局变量,但仍然没有运气。 也许我想念一些东西。 谢谢。

为了增加Ansgar Wiechars的答案,有以下区别:

  • 作业将在后台启动新流程,但为您提供了运行多个实例,排队和取回数据的大量框架。 但是,在Windows中为每个作业启动一个新过程非常昂贵。
  • 启动新的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使用启动过程在脚本块中执行功能会引起奇怪,并带有双引号

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM