Powershell 在脚本中运行带有启动进程的函数

Powershell 在脚本中运行带有启动进程的函数,powershell,Powershell,我正在尝试初始化大量powershell窗口,以帮助快速完成扫描。每个窗口需要不同的输入,我有一个数组变量提供该输入。启动进程函数似乎可以工作,但如果我使用“,它会给我一个未知函数错误,当我使用” foreach($search in $Partlist){ start-process powershell.exe -argumentlist '-nologo -noprofile -executionpolicy bypass -command .\Get-Data -search $

我正在尝试初始化大量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的答案,有以下区别:

  • 乔布斯会在幕后启动新的流程,但会给你带来很多好处 用于运行多个实例、排队和获取数据的框架 然而,在这种情况下,为每项工作启动一个新流程是昂贵的 窗户
  • 启动一个新的Powershell窗口至少会和作业一样慢,但会增加视觉元素的额外开销,并且很难将结果返回到调用过程
  • 运行空间可能会执行得更快,因为 它们在同一进程中作为线程运行,这要便宜得多 实例化,因为它们使用现有的进程块(这是一个 Windows结构,而不是PS结构)
这里有一篇很好的文章:但要注意不要做得太过分:

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

[System.Environment]::SetEnvironmentVariable("MyVar", 22, "User")
您将生成一个新的powershell窗口,并使用以下内容进行检查:

$env:MyVar
Remove-Item env:\myvar
您可以使用以下命令将其删除:

$env:MyVar
Remove-Item env:\myvar
您生成了另一个新的powershell窗口,而环境变量仍然存在。进一步的实验将显示,每个新进程都会生成一个新的全局范围

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

  • 您的命令不在生成新进程的路径中
  • 您的变量值没有赋值,因为您在单引号中传递它们,而新流程的作用域中没有它们

使用运行空间,或参考以下内容:

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

  • 乔布斯会在幕后启动新的流程,但会给你带来很多好处 用于运行多个实例、排队和获取数据的框架 然而,在这种情况下,为每项工作启动一个新流程是昂贵的 窗户
  • 启动一个新的Powershell窗口至少会和作业一样慢,但会增加视觉元素的额外开销,并且很难将结果返回到调用过程
  • 运行空间可能会执行得更快,因为 它们在同一进程中作为线程运行,这要便宜得多 实例化,因为它们使用现有的进程块(这是一个 Windows结构,而不是PS结构)
这里有一篇很好的文章:但要注意不要做得太过分:

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

[System.Environment]::SetEnvironmentVariable("MyVar", 22, "User")
您将生成一个新的powershell窗口,并使用以下内容进行检查:

$env:MyVar
Remove-Item env:\myvar
您可以使用以下命令将其删除:

$env:MyVar
Remove-Item env:\myvar
您生成了另一个新的powershell窗口,而环境变量仍然存在。进一步的实验将显示,每个新进程都会生成一个新的全局范围

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

  • 您的命令不在生成新进程的路径中
  • 您的变量值没有赋值,因为您在单引号中传递它们,而新流程的作用域中没有它们

使用运行空间,或参考以下内容:

什么是
获取数据
?脚本或函数?它看起来像脚本的路径,在这种情况下,请尝试使用完整路径,因为除非您将WorkingDirectory参数传递给start-process,否则新进程将不会在当前目录中启动。请不要使用PowerShell使桌面混乱l windows我建议你开始研究。写完整路径的问题是它需要用引号引起来,因为路径名中有空格。它也是一个脚本,但我把它变成了一个函数,因为它需要输入。我现在正在研究作业。什么是
获取数据
?脚本或函数?它看起来像是脚本的路径,在这种情况下,请尝试使用完整路径,因为除非您将WorkingDirectory参数传递给start-process,否则新进程将不会在当前目录中启动。我建议您开始研究PowerShell windows,而不是让桌面混乱。写入完整路径的问题是它需要加引号,因为路径名中有空格。它也是一个脚本,但我把它变成了一个函数,因为它需要输入。我现在正在寻找作业。什么是
获取数据
?脚本或函数?它看起来像是脚本的路径,在这种情况下,请尝试使用完整路径,因为新进程不会在当前目录中启动,除非您给出pass In要启动进程的WorkingDirectory参数。与其让桌面上的PowerShell窗口乱七八糟,我建议您开始研究。编写完整路径的问题是,它需要用引号括起来,因为路径名中有空格。它也是一个脚本,但我有点把它变成了一个函数,因为它需要输入。我正在研究现在开始找工作。