在PowerShell的页眉/页脚中包含公共代码

时间:2017-08-07 18:50:37

标签: powershell

我的大部分脚本都有通用的功能和格式。每个脚本都会为我提供一个粘贴工作站的窗口,它会执行基本任务,例如在继续之前检查连接。通常,我复制并粘贴此代码并修改正文。我想要做的是包括页眉和页脚,但我得到"错过关闭'}'在声明块中。"错误。例如:

<# Begin Header #>
if($canceled) {
    write-host "Operation canceled."
}
else {
    if($computers.length -gt 0) {
        [array]$computers = $computers.split("`n").trim()

        # Loop through computers entered
        foreach($pc in $computers) {
            # Skip zero length lines for computers
            if(($pc.length -eq $null) -OR ($pc.length -lt 1)) {
                continue
            }
            else {
                # Try to connect to the computer, otherwise error and continue
                write-host "Connecting to: $pc$hr"
                if(test-connection -computername $pc -count 1 -ea 0) {
                    <# End Header #>

                    Body of script

                    <# Begin Footer #>
                }
                else {
                    utc # Unable to contact
                }
            }
            write-host "`n"
        }
    }
}
<# End Footer #>

不是每次复制/粘贴,我宁愿这样做......

&#34; C:\脚本\ header.ps1&#34;

- 代码 -

&#34; C:\脚本\ footer.ps1&#34;

当标题以开括号结尾时,这是否可能?我在PHP中这样做,但我无法在PowerShell中找到解决方法。

1 个答案:

答案 0 :(得分:2)

您的方法可以更改为将函数存储在一个文件中,而将自定义脚本存储为另一个文件中的每个服务器。您可以将脚本块存储到PowerShell中的变量,并将其作为参数传递给函数。您可以使用Invoke-Command -scriptblock $Variable来执行该代码。

像这样编写你的函数:

function runAgainstServerList {
    param ( [ScriptBlock]$ScriptBlock) 
    if($canceled) {
        write-host "Operation canceled."
    }
    else {
        if($computers.length -gt 0) {
            [array]$computers = $computers.split("`n").trim()

            # Loop through computers entered
            foreach($pc in $computers) {
                # Skip zero length lines for computers
                if(($pc.length -eq $null) -OR ($pc.length -lt 1)) {
                    continue
                }
                else {
                    # Try to connect to the computer, otherwise error and continue
                    write-host "Connecting to: $pc$hr"
                    if(test-connection -computername $pc -count 1 -ea 0) {

                        Invoke-Command -ScriptBlock $ScriptBlock

                    }
                    else {
                        utc # Unable to contact
                    }
                }
                write-host "`n"
            }
        }
    }
}

现在将其保存到您的包含文件中,例如&f; myFunctions.ps1&#39;

然后创建您希望按服务器运行的自定义脚本,如下所示:

. myFunctions.ps1

[ScriptBlock]$ScriptBlockToPass = {
     ## Insert custom code here
}

runAgainstServerList $ScriptBlockToPass

为了让您更接近可能的最终目标,您可能希望将-ComputerName "ComputerNameHere"参数附加到所包含函数中的invoke-command语句中。这将导致您的脚本在远程系统上而不是在本地执行。