我有一个有效的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变量中大括号之间的内容。
感谢任何帮助。
答案 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中提取{}