问题标签 [powershell-jobs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
666 浏览

powershell - 有什么方法可以告诉以 start-job -filename 启动时正在运行的脚本是什么?

我正在使用以下命令开始 PowerShell 作业:

然而,这个脚本需要知道它的位置,因为它会根据相对于它的位置运行其他命令。当直接从提示符运行时,这些结构可以工作:

然而,当作为第一个示例中的工作开始时,这根本不起作用。当我开始工作时,如何确定我从哪里开始?

0 投票
2 回答
1932 浏览

powershell - *.ps1 脚本可以作为后台作业本身运行 *.ps1 脚本吗?

我想运行一个脚本的 15 个实例,将 5 个脚本连接在一起,到目前为止,我还没有看到精灵的灰尘。我将问题归结为一个测试用例,主脚本调用从脚本,从脚本又调用 sub_slave 脚本(重现故障不需要管道。)

如果 master.ps1 调用 slave.ps1,则每个后台作业都会在 slave.ps1 调用 sub_slave.ps1 时无限期挂起。如果我注释掉 slave.ps1 中对 sub_slave.ps1 的调用,master.ps1 将运行完成。如果我直接启动 slave.ps1,它会很好地运行对 sub_slave.ps1 的调用。这个问题似乎很棘手,但如果我尝试双链。我在文档中没有看到任何内容说您不能将这些脚本以菊花链方式连接到任意深度,但也许我的阅读不够深入?

你会看到我通过将内容添加到一个简单的文本文件来跟踪脚本的进度。

d:\jobs\master.ps1

d:\jobs\slave.ps1

d:\jobs\sub_slave.ps1 #需要 -version 2.0

当代码按照编写的方式运行时,没有任何注释,我在 out.txt 中得到了这个:d:\jobs\out.txt

请注意,每条告别消息之后的下一个命令是对 sub_slave.ps1 的调用,并且根本不会出现来自 sub_slave.ps1 的消息。系统将挂起,3 个 powershell.exe 进程永远快乐地运行。Get-job 报告 3 个进程仍在运行和 HasMoreData。

我得到的唯一线索是,如果我崩溃转储挂起的进程,我会看到:

也许我遇到了某种参数问题?如果我从 sub_slave.ps1 中删除所有参数,则行为不会改变,所以我有点怀疑,但这是可能的。我对任何想法都持开放态度。

0 投票
2 回答
3426 浏览

powershell - 如何调试 PowerShell 后台作业?

Jason Archer 帮助我解决了上一个问题,但在测试他的解决方案时,我偶然发现了真正的问题。我的服务器无法正确运行链接的后台作业,但我的笔记本电脑可以。

如果我在笔记本电脑上运行上一个问题中的脚本,它们可以完美运行。脚本 A 将脚本 B 作为后台作业启动,脚本 B 从该作业中调用脚本 C,并接收所有输出。如果我在服务器上运行完全相同的脚本,脚本 A 会调用脚本 B,而脚本 B 会无限期挂起。如果我直接运行脚本 B,它会在服务器或笔记本电脑上完美执行。这是关于工作的背景让我死去的事情。

$PSVersionTable 在所有计算机上返回相同的结果,但很明显我必须在 WinXP 和 Win2003R2 上使用不同的安装程序。

什么可能导致行为差异?

有没有办法解决后台作业中发生的事情?如果我可以看到正在接收的命令行(我已经记录了发送的内容,但有时事情会漂移),或者什么对象真的在挂东西,也许它会有所帮助,但调试器不会把我带到那里。也许有一种方法可以在 ISE 中调用该作业,就好像它在后台运行一样?

0 投票
4 回答
9370 浏览

powershell - 如何调用 Start-Job,它依赖于与调用 Start-Job 的函数相同的 powershell 模块中的函数?

我正在编写一些 powershell 以在单个模块中与 AWS API 对话。我编写了一个函数,Get-CloudFormation它返回 CloudFormation 的状态。我编写了另一个函数 ,Delete-CloudFormation它在触发 delete-CF API 请求后,尝试启动一个作业,使用我的Get-CloudFormation.

我呼吁Export-ModuleMemberGet-CloudFormation但不是Delete-CloudFormation;这是一个私人功能)。 Get-CloudFormation在模块文件中的定义早于Delete-CloudFormation.

我的Start-Job电话(内部Delete-CloudFormation)看起来像:

运行时Delete-CloudFormation,出现异常:

为什么?我该如何解决?

我发现7152090我认为是相似的,但调用Start-Jobwith-InitializationScript { Get-CloudFormation }给出了大致相同的错误。

如果我调用 Start-Job ,-InitializationScript { Import-Module ".\awsutils.psm1" }那么.就是我的个人资料的文档目录。即使我将变量绑定到Get-Location外部Start-Job并像-InitializationScript { Import-Module "$location\awsutils.psm1" }.

0 投票
3 回答
4469 浏览

powershell - Powershell:将参数传递给存储在变量中的函数

我试图获得一个在工作中使用函数的简单工作示例。我已经设法将我的函数传递到用于我的工作的脚本块中,但我似乎无法获取函数的参数。

这是输出:

因此,正如输出中的 OUT: x3 所证明的那样,我的函数被调用了,但我还没有找到任何允许我获取函数参数的语法。想法?

编辑:

请注意下面 Shawn 的观察和我的回复,我尝试使用函数作为变量,因为使用传统函数似乎不起作用。如果有办法让它工作,我会很高兴不必将我的函数作为变量传递。

0 投票
1 回答
910 浏览

multithreading - Powershell:接收作业中的意外结果

我试图更好地了解 powershell 如何处理作业。

这两篇文章都有很大帮助:

但是,使用以下示例脚本,我在调用 Receive-Job 时得到了意想不到的结果。我希望每一行都有一个结果,但有时我会看到每行有多个结果或额外的空白回车。关于如何只写出每个作业从控制台流入的信息的任何想法?

输出可以...

或者有时...

0 投票
1 回答
429 浏览

powershell - 当 -path 是变量时,gci 没有接收作业结果

这不返回任何内容:

但是提供没有变量的路径参数,就像这样......

...返回该临时文件夹的内容,在本例中为 durrr.txt。这是在带有 Powershell $host.version 输出的 Windows Server 2008R2 SP1 上,如下所示:

怀疑 Powershell 的 v3,我尝试将 Windows 7 SP1 桌面从 v2 更新到 v3,但没有运气重现问题。在升级后的桌面上,$host.version 输出现在与上述匹配。

这是怎么回事?

编辑/发生了什么?

被破坏的工作似乎等同于

所以 gci 返回后台作业当前目录的结果,Documents 文件夹恰好是空的。

0 投票
2 回答
3273 浏览

powershell - Powershell:作为作业调用时调用“GetOwner”的异常:“未找到”

我需要得到所有者的一些procs。下面我的演示脚本将首先在本地查找所有者的 procs,然后它会做同样的事情,但它会在同一个盒子上调用命令:

大多数时候,当我运行我的脚本时,它会出现以下输出错误:

所以前 38 是它为本地运行的所有者找到的 procs 数。它第二次也找到 38,但调用 getowner 时出错。我不明白为什么,因为它第一次工作。当我调用命令时,它是否在某种“气泡”中运行?在我较大的脚本中,这给我带来了更严重的问题,因为作业状态失败并且执行停止,即使它抛出相同的错误。不过一次一个问题。

0 投票
2 回答
2692 浏览

.net - Powershell Receive-Job 可以返回数据集吗?

背景资料

我有一个应用程序,它与多个数据库建立多个 SQL 连接,目前需要很长时间才能执行。

Powershell (.NET) 将等待每个正在进行的“ SQL-GET ”函数完成,然后才能触发下一个。我的印象是,我可以通过在他们自己的后台作业中同时触发每个“ SQL-GET ”函数来显着加快这个应用程序的速度!然后我会在他们完成时从每个作业中检索数据。理想情况下作为 DataSet 系统对象。

问题

从后台作业中检索数据时,我只能设法取回一个System.Array对象。我实际上追求的是一个System.DataSet对象。这是必要的,因为应用程序中的所有逻辑都依赖于 DataSet 对象。

代码

这是一段 v.simple 代码,它将创建一个 sql 连接并用返回的结果填充一个新创建的数据集对象。工作一种享受。$results是一个 DataSet 对象,我可以很好地操作它。

这是包装在新后台作业的 scriptblock 参数中的非常相同的代码。只有在调用 Receive-Job 时,我才得到一个数组,而不是数据集。

任何帮助将不胜感激!!!

迄今为止的研究

我已经完成了旧的谷歌,但我偶然发现的所有帖子、博客和文章似乎都深入到了关于管理工作和所有关于这方面的花里胡哨的深度。仅通过接收作业 cmdlet 返回一个数组是 powershell 的基本性质吗?

我已阅读有关返回表达式的堆栈帖子。以为我在做某事。尝试:

  • return $results.Tables[0]
  • return ,$results.Tables[0]
  • return ,$results

所有仍然返回一个数组。

我见过人们相当麻烦地手动将数组转换回数据集对象-尽管这看起来很“肮脏”-我很迂腐并且希望必须有一种方法让这个神奇的数据集对象遍历后台作业和进入我当前的会话!:)

重申

基本上,我只想让从 Receive-Job cmdlet 中检索到的 $ret_results 对象成为一个 DataSet……甚至是一个 DataTable。我会采取任何一个......只是不是一个阵列:)

0 投票
1 回答
1308 浏览

powershell - Powershell Invoke-Command 使用 -AsJob 远程启动远程程序失败

我想启动一个长时间运行的远程程序,但不想等待。所以我在 PS 脚本文件中放入一行命令并运行“Powershell -file xxx.ps1”

但是脚本运行后远程程序没有运行,但是如果我在 PS 控制台交互运行上述命令,远程程序运行正常。似乎程序在脚本终止时被杀死。

为什么是这样?

更新

如果我在脚本结束时睡 1 秒,远程应用程序运行良好。