【问题标题】:Importing Scriptblock from file从文件导入脚本块
【发布时间】:2015-01-16 20:45:57
【问题描述】:

我有一个可用的 Powershell 脚本,我想从外部文件中提取脚本块。

工作:

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

“get-job -id | receive-job”的输出很好

不工作:

# 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 | receive-job”的输出为空

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

感谢您提供任何帮助。

【问题讨论】:

  • 这对你有用吗? $Scriptblock = [scriptblock]::Create((Get-Content E:\Dashboard\Windows\winrm_scriptblock.txt))

标签: powershell winrm


【解决方案1】:

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

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

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

【讨论】:

  • 这可以在上述答案失败时加载包含 CmdletBindings 的独立 ps1。
【解决方案2】:

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.
....

【讨论】:

  • 试过这个,它对我不起作用。我的脚本块长约 350 行并接受参数。不确定这是否重要。
  • 我会尝试传递参数,看看它是否有效。长度本身根本不重要
  • @kernelpanic 更新后的答案应涵盖该基础。
【解决方案3】:

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

【讨论】:

  • 以我为例 - 我想在远程机器上执行脚本块,通过参数传递它或使用变量范围,所以这对我不起作用。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2021-11-18
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多