我的大部分脚本都有通用的功能和格式。每个脚本都会为我提供一个粘贴工作站的窗口,它会执行基本任务,例如在继续之前检查连接。通常,我复制并粘贴此代码并修改正文。我想要做的是包括页眉和页脚,但我得到"错过关闭'}'在声明块中。"错误。例如:
<# 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中找到解决方法。
答案 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
语句中。这将导致您的脚本在远程系统上而不是在本地执行。