从文件导入Scriptblock

时间:2015-01-16 20:45:57

标签: powershell winrm

我有一个有效的Powershell脚本,我希望从外部文件中提取脚本块。

工作:

$scriptblock = { ... }
invoke-command -ComputerName $server -ScriptBlock $Scriptblock -ArgumentList $server,$team -Credential $credential -asjob -JobName Dashboard_$server -SessionOption (New-PSSessionOption -NoMachineProfile)

输出" get-job -id |接收作业"很好

无效:

# Generate scriptblock from file
$file = Get-Content E:\Dashboard\Windows\winrm_scriptblock.txt
$Scriptblock = $executioncontext.invokecommand.NewScriptBlock($file)

invoke-command -ComputerName $server -ScriptBlock $Scriptblock -ArgumentList $server,$team -Credential $credential -asjob -JobName Dashboard_$server -SessionOption (New-PSSessionOption -NoMachineProfile)

输出" get-job -id |接收作业"是空的

winrm_scriptblock.txt的内容正是工作版本中定义的scriptblock变量中大括号之间的内容。

感谢任何帮助。

4 个答案:

答案 0 :(得分:5)

我知道您已经有了答案,但从脚本文件中获取脚本块的另一种方法是使用get-command cmdlet:

$sb=get-command C:\temp\add-numbers.ps1 | select -ExpandProperty ScriptBlock 

$ sb现在是脚本的脚本块。

答案 1 :(得分:1)

How do I pass a scriptblock as one of the parameters in start-job

的答案非常相关

如果你存储了字符串" Get-ChildItem C:\ temp"在文件" E:\ Dashboard \ Windows \ winrm_scriptblock.txt"那么这段代码应该输出文件夹的内容" C:\ temp"在你的本地机器上。

Invoke-Command -ScriptBlock ([scriptblock]::Create((Get-Content "E:\Dashboard\Windows\winrm_scriptblock.txt")))

<强>参数

就传递参数而言,Pass arguments to a scriptblock in powershell也涵盖了答案。正如Keith Hill所述:一个脚本块只是一个匿名函数

考虑以下文件内容

param(
    $number
)

$number..2 | ForEach-Object{
    Write-Host "$_ lines of code in the file."
}

命令

Invoke-Command -ScriptBlock ([scriptblock]::Create((Get-Content "E:\Dashboard\Windows\winrm_scriptblock.txt"))) -ArgumentList "99"

会给你烦人的输出

99 lines of code in the file.
98 lines of code in the file.
97 lines of code in the file.
....

答案 2 :(得分:1)

有什么理由不使用Invoke-Command的-FilePath参数?

答案 3 :(得分:-2)

你必须从E:\ Dashboard \ Windows \ winrm_scriptblock.txt中提取{}