问题标签 [scriptblock]

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 回答
2128 浏览

powershell - 使用多个参数和 foreach 循环调用 PowerShell Start-Job cmdlet 非常接近

我有几千台计算机将安全事件日志备份到服务器的共享中。环境非常动态,因此需要自动化。

我一直在研究一个创建哈希的脚本,其中每个键是一个序列,每个键的值是 N 台计算机。我将键和值传递给另一个脚本,该脚本将运行 n 个作业来备份日志;n 取决于我可以在每个作业中包含多少台机器,并且仍然可以有效地处理备份。

脚本 1 有这个块:

脚本 2 有:

我正在通过尝试将计算机数组写入文件来对此进行测试,因此Add-Content.

我显然在创建脚本块时做错了。Get-Job | %{$_.Command}显示:

没有任何内容被写入 myCorrectPath。

如果我写:

在脚本块的末尾,显示屏会显示主机名列表中的最后一个主机名。

如何编写脚本块,使其遍历脚本块中的主机名数组以处理一个作业中的每个元素?

0 投票
1 回答
1046 浏览

powershell - PowerShell“=”不是可识别的 cmdlet 错误

除了此处给出的响应:PowerShell Enter Session find path bug 之外,我在脚本中遇到了另一堵墙,我无法解决。以下脚本返回错误:

术语“=”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。

我可以创建脚本块变量 ($sb),但是当我调用它时,我得到了错误。我已将其范围缩小到$Acl变量的设置,并尝试以各种方式重写但没有运气。我错过了什么?

0 投票
2 回答
4144 浏览

function - 如何在脚本块外调用函数

我有一个函数,我应该可以从我的 powershell 脚本中的任何位置调用它。

问题是它不能识别脚本块中的函数。

在下面的示例中,我有一个getNumberFive应该返回数字 5的函数。
我希望能够在我开始一项新工作时以及在脚本结束时在脚本块中使用这个函数。

预期结果:
将数字15写入文件“C:\tmp\result.txt”
写入控制台:“我喜欢数字 5”

实际上:
将数字10写入文件“C:\tmp\result.txt”
写入控制台:“我喜欢数字 5”

我可以通过在脚本块中定义相同的函数来解决这个问题,但是我将复制该函数,这不是一个好的编程。

另一种方法是定义:

但在这种情况下,我将无法调用$five = getNumberFive.

我阅读了许多方法,但我不明白如何准确地使用它们:
CALLING A POWERSHELL FUNCTION IN A START-JOB SCRIPT BLOCK WHEN 它在同一个脚本中定义

如何将命名函数作为参数传递(脚本块)

https://social.technet.microsoft.com/Forums/ie/en-US/485df2df-1577-4770-9db9-a9c5627dd04a/how-to-pass-a-function-to-a-scriptblock?forum=winserverpowershell

PowerShell:将函数作为参数传递

在带参数的函数上使用 Invoke-Command -ScriptBlock

我的脚本:

0 投票
1 回答
976 浏览

function - 如何在调用者的上下文中调用脚本块?

考虑以下调用站点:

我想实现SomeScriptblockInvoker这样

  1. 它在一个模块中定义,并且
  2. 在调用者的上下文中调用脚本块。

调用站点的函数输出如下:

PowerShell 似乎能够做到这一点。例如,替换SomeScriptblockInvokerForEach-Object恰好产生所需的输出。

我已经接近使用以下定义:

使用该定义的呼叫站点的输出如下:

请注意,DollarBar它应该是空的input object

(检查正确行为的 Pester 测试要点)

0 投票
1 回答
56 浏览

powershell - Powershell中的变量问题

您好,我正在使用下面的脚本块,并在测试路径时传递了变量本地文件夹$Null。你能建议我在这里缺少什么吗

0 投票
0 回答
145 浏览

arrays - 运行空间脚本块数组无法传递

我正在修改下面的代码。它应该创建一个 PoshRSJob 并foo在那里的运行空间中再次运行该函数。

我希望能够将$list参数转换为[array]or [string[]],但是当我这样做时会引发错误。我考虑将我的数组展平为一个字符串,但如果我更改$list3为在字符串中包含空格或逗号,它也会引发错误。我相信是这条线导致了这个问题,但我不知道为什么或怎么做才能绕过这个问题:

代码:

这是错误:

输入对象不能绑定到命令的任何参数,因为命令不接受管道输入,或者输入及其属性与接受管道输入的任何参数都不匹配。

有谁知道如何使它工作,以便我可以将列表传递到运行空间?

0 投票
1 回答
709 浏览

powershell - PowerShell 三元和默认运算符

基于这个答案,我尝试创建另一个重用该三元运算符的运算符(别名),并且在执行命令时出现错误:

管道元素中“&”之后的表达式产生了一个无效的对象。它必须产生一个命令名称、一个脚本块或一个 CommandInfo 对象。

当返回来自三元运算符的值时,会在行上引发错误。我几乎坚持下去,我不明白为什么会发生这种情况。

编码:

用法:

这工作正常:

这会引发上述错误:

0 投票
1 回答
259 浏览

powershell - 比较对象的脚本块返回对象

我正在编写一个脚本来通过比较对象比较 2 个 samba 位置。

为了加快速度,我想通过一个线程将每个位置提供给一个脚本块,让我在其中制作对象。之后,我希望脚本块的输出作为对象在 Compare-Object cmdlet 中使用。

到目前为止我有什么:

所以仍然需要在某处添加它:

但是 test 和 test2 的结果是哈希表(我认为?)而不是对象。

任何输入将不胜感激我哪里出错了,或者我可以如何以不同的方式做

0 投票
3 回答
1821 浏览

powershell - 在远程 ps 会话中的调用命令中退出不退出

我有一个函数调用一个命令,该命令在远程服务器上启动一个新的 ps 会话。调用命令有一个 Exit 子句,但是这没有退出?

Get-AD 命令工作正常,所以它不应该显示“没有退出”它确实 - 我如何从远程 ps 会话中的脚本块退出?

我正在尝试断开连接会话和 Exit-pssession 以查看它们是否会与简单地退出相同,但这些都不起作用。

我也尝试过Break,但没有运气。

0 投票
0 回答
418 浏览

powershell - 为什么 PowerShell 的 Start-Job 有时会在不执行代码的情况下完成?

我一直在调查我们在工作中的一些部署中看到的一个问题。

作为背景,我们在 Azure 中部署了多个服务,并且有一个Start-Job用于运行并发子作业的主脚本。在大多数情况下,这很有效,尽管偶尔我们会看到子作业报告为已完成的构建,但它的HasMoreData属性是false,并且在任何地方都没有出现错误。如果没有至少一行日志,我们运行的任何子作业都无法成功完成,因此这似乎是启动作业时出现的错误。

这是我们用来创建作业的命令:

在讨论过程中,我们认为可能存在错误,但我们Invoke-Expression正在吃它,所以我们将创造就业机会改为:

自昨天进行更改以来,我们还没有看到此问题再次出现。为了测试,我创建了一个新分支,在其中我恢复到该Invoke-Expression方法并立即再次开始看到错误。

我只是希望看看是否有人知道为什么会出现这个问题,以及为什么在使用 Invoke-Expression 方法时它是一个间歇性问题,而不是该[ScriptBlock]::Create方法。

谢谢!

编辑以获取更多背景:

因此,主脚本 (deployAll.ps1) 有一个要部署的服务列表,并为每个服务构建一个要执行的命令,该命令构建必要的环境,然后调用每个服务提供的 deployService.ps1 脚本。

关于构建要执行的命令,我们有一个所有子作业都使用的通用脚本,因此我们将其导入并登录到 Azure 作为我们构建的命令的一部分,因此实际传递给 Start-Job 的命令看起来像:

Import-Module $ScriptPath\AzureWrapper.ps1 -Force; $ScriptPath\login.ps1 -AzureAppID $Env:AZURE_APP_ID -AzurePassword $Env:AZURE_PASSWORD -AzureTenantId $Env:AZURE_TENANT_ID; $ScriptPath\..\$RepoName\deploy\deployService.ps1 -subscriptionId '$subscriptionId' -environmentFilePath '$configPath'

此外,在Invoke-Expression进一步研究之后,似乎这些设置命令是必要的原因,因为它在单独的环境中运行。