问题标签 [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 投票
1 回答
96 浏览

powershell - 尝试编写一个函数,该函数采用带有参数和参数列表的脚本块,编辑该脚本块,然后运行调用命令

我正在编辑一个函数,它将直接在 VM 上调用命令。我一直遇到的问题是,如果有人将函数声明作为脚本块传递,我在调用 create 时会出错,因为params()它不在脚本块的顶部。

试图弄清楚我如何仍然可以set-fulllanguage先执行带有参数的函数。

0 投票
2 回答
487 浏览

arrays - 在powershell脚本块中向数组添加元素将数组转换为字符串

我注意到在脚本块中使用数组的奇怪行为。以下代码显示了问题:

执行脚本将产生以下输出:

脚本块$bad不像我预期的那样工作。它将数组转换为字符串,但它应该简单地将元素添加z到数组中。如果没有添加元素,则可以按预期使用数组。

我在 powershell 5.0 和 5.1 中注意到了这种行为,但在 ISE 中没有。这是一个错误还是任何人都可以解释这个?

0 投票
2 回答
310 浏览

powershell - 为什么在使用基于括号的 -Filter 参数时 $PSItem 的行为不符合预期?

我正在帮助用户解决这个问题,链接到我的答案:Powershell script to add users to A/D group from .csv only using email address?

最初我编写脚本如下,使用基于括号的过滤器,Get-AdUser如下所示:

但是,$_.EmailAddress未能填充值。但是,将Get-ADUser过滤器更改为基于字符串的过滤器按预期工作:

$aduser = Get-ADUser -Filter "EmailAddress -eq '$($_.EmailAddress)'"

我正在经历什么奇怪的事情,为什么?是因为当我使用括号时,它被视为一个新范围并且$PSItem不会跟随?

0 投票
0 回答
39 浏览

powershell - 如何参数化脚本块内的命令调用?

我正在尝试使用要传递给 Invoke-Command 的脚本块编写 PowerShell 脚本。脚本块需要调用一个可执行文件,其路径由 PowerShell 变量(本例中为 $bar)确定

但是,当我尝试执行此操作时,出现以下异常:

test.ps1 由以下几行组成:

似乎可以使用变量 $bar,但前提是没有参数(cmd2)。即使有参数(cmd1)也可以使用文字 foo.exe

我想对可执行文件名称和超过 0 个参数(cmd3)使用变量引用,但似乎不允许这种情况。

为什么?

0 投票
1 回答
2485 浏览

multithreading - 如何在运行空间脚本块中调用外部定义的函数

我有一个复杂的 PowerShell 函数,我想运行另一个线程。

但是,如果我是对的,则无法在脚本块中访问该函数。我想避免复制它旁边的每个相关功能。

有什么方法或方法可以调用脚本块中的函数吗?

0 投票
2 回答
405 浏览

function - 支持词法范围的 ScriptBlock 参数(例如 Where-Object)

考虑以下任意函数和测试用例:

Foo-MyBar在测试 1 中,我们通过过滤器将结果传递给管道,该Where-Object过滤器将返回的对象与包含在私有范围变量中的模式进行比较$private:pattern。在这种情况下,这将正确返回 C:\ 中以字母开头的所有文件/文件夹T

在测试 2 中,我们直接将相同的过滤脚本作为参数传递给Foo-MyBar. 但是,Foo-MyBar到运行过滤器时,$private:pattern它不在范围内,因此不会返回任何项目。

我理解为什么会这样——因为传递给的 ScriptBlockFoo-MyBar不是闭包,所以不会关闭$private:pattern变量并且该变量会丢失。

我从评论中注意到,我之前有一个有缺陷的第三次测试,它试图通过 {...}.GetNewClosure(),但这并没有关闭私有范围的变量——感谢@PetSerAl 帮助我澄清这一点。

问题是,如何Where-Object捕获$private:pattern测试 1 中的值,以及我们如何在我们自己的函数/cmdlet 中实现相同的行为?

(最好不需要调用者必须知道闭包,或者知道将他们的过滤器脚本作为闭包传递。)

我注意到,如果我取消注释$Filter = $Filter.GetNewClosure()里面的行Foo-MyBar,那么它永远不会返回任何结果,因为$private:pattern它丢失了。

(正如我在顶部所说,函数和参数在这里是任意的,作为我真正问题的最短形式再现!)

0 投票
1 回答
1152 浏览

c# - 如何在 C# 中使用 powershell 调用命令?

如果我在 Powershell 中运行以下命令,它会按预期工作

invoke-command -computername [name] -scriptblock { ipconfig.exe > c:\ipconfig.txt }

但是当我尝试将其合并到 ac# 函数中时,我收到了这个错误

{"无法绑定参数 'ScriptBlock'。无法将类型为 \"System.String\" 的 \"ipconfig.exe > c:\ipconfig.txt\" 值转换为类型 \"System.Management.Automation.ScriptBlock\"。 "}

即使我将 scriptblock 参数值转换为 System.Management.Automation.ScriptBlock 对象?我在做什么不正确?

0 投票
1 回答
322 浏览

windows - PowerShell - 通过 Invoke-Command 发送变量

我有 3 台 Windows 2016 服务器和一些我想自动化的日常任务。我是 PowerShell 的新手,所以我花了很多时间在 StackOverflow 和“谷歌搜索”中寻找答案。

我的任务是在远程服务器上通过 7zip 备份一些文件。

有一个命令很好用:

但我需要在 bluecollar_121.zip 存档名称中添加日期,它应该看起来像 bluecollar_13.08.2018.zip

我已经尝试了大量的变体,但没有运气。

第二次尝试是:

最后一次尝试:

他们都没有工作。问题是 $stime 变量。如何将变量 $stime 放入 Invoke-Command ?

UPD1:我解决了这个问题!

0 投票
2 回答
127 浏览

powershell - 为什么传递给脚本块的参数不起作用?

完全披露:我的问题可能是基于对 Xen Desktop 的 Citrix PowerShell 模块的不完全理解。

我有以下脚本块。它在一个循环中被调用,对列表中的每个 VM 调用一次。我正在使用PowerShell Jobs,因为我想在作业运行时保持 UI 线程自由更新 UI。

代码“A”

代码“A”工作正常,但它需要更长的时间,因为我Connect-XenServer每次调用脚本块时都在执行 cmdlet。

因此,我尝试在循环外调用Connect-XenServer一次并传入会话变量,如下面的代码 "B"所示。结果是Could not find open sessions to any XenServers在脚本块内引发了错误。我假设 $xss 会话变量在传递到脚本块时会以某种方式受到影响。

任何想法为什么 $xss 会话变量会受到影响?

代码“B”

Robert Cotterman受答案启发的其他示例

在所有情况下,我仍然收到Could not find open sessions to any XenServers错误

仅供参考 - 使用 PowerShell 5.1

使用$using. 变量内容按预期传入和传出

输出

使用 args 的示例。变量内容按预期传入和传出

输出

使用命名参数的示例。变量内容按预期传入和传出

输出

0 投票
3 回答
1454 浏览

powershell - For PowerShell cmdlets, can I always pass a script block to a string parameter?

I'm looking at the documentation of PowerShell's Rename-Item cmdlet and there is an example like this.

This example shows how to use the Replace operator to rename multiple files, even though the NewName parameter does not accept wildcard characters.

This command renames all of the .txt files in the current directory to .log.

The command uses the Get-ChildItem cmdlet to get all of the files in the current folder that have a .txt file name extension. Then, it uses the pipeline operator (|) to send those files to Rename-Item .

The value of NewName is a script block that runs before the value is submitted to the NewName parameter.

Note the last sentence:

The value of NewName is a script block that runs before the value is submitted to the NewName parameter.

Actually NewName is a string:

So does that means I can always use a script block when the required parameter type is a string?