目的 - 通过SQLPlus和Powershell(通过计划任务)监视Oracle11 SQL Server中的特定数据队列。正在触摸多个服务器,根据哪些系统需要额外关注,列表将是动态的。
限制:我有PS 2.0,Oracle11.2和SQLPlus 11.2,Windows Server 2k8,管理员权限(但不能真正安装像cmdlet这样的东西)
功能:我需要PS / SQL脚本以一分钟的间隔运行,以便我们能够密切关注队列。我目前有一串蝙蝠文件来完成这个,但是我真的想让它更清洁,更容易维护(更少的文件要修改等)。我有一个辅助PS脚本,只在最终输出文件上执行Get-Content -wait。这使得我和我的同事(两个工作中心的24小时工作人员)能够密切关注这一点。不,我们没有最全面的安装,这会使我遇到的一些问题变得更容易。 :耸肩:
Set-ExecutionPolicy Bypass
Set-Location -Path E:\path\path\path\NEW
$filePath1 = "E:\path\path\path\NEW"
$filePath2 = "E:\path\path\path\NEW\Log"
$filePath3 = "E:\path\path\path\NEW\Log\ServerOutput"
$file1 = "E:\path\path\path\NEW\ServerList.txt"
$file2 = "E:\path\path\path\NEW\Log\Queue_Check_$d.log"
$file3 = "E:\path\path\path\NEW\Log\ServerOutput\$server01.txt"
$file4 = "E:\path\path\path\NEW\Log\ServerOutput\$server02.txt"
$d = Get-Date -Format "ddMMMyyyy"
$t = Get-Date -DisplayHint Time
$serverList = (Get-Content $file1) -replace '#.*' | Where-Object { $_.Trim() -ne '' }
$arr = $serverList -split ' '
$server01 = $arr[0]
$server02 = $arr[1]
$server01 > $filePath3\$server01.txt
$t >> $filePath3\$server01.txt
$check01 = Invoke-Command -ComputerName $server01 {
cd E:\path\path
sqlplus -s user/pass@instance '@LOB_QUEUE_CHECK.sql'
}
$check01 >> $filePath3\$server01.txt
$server02 > $filePath3\$server02.txt
$t >> $filePath3\$server02.txt
$check02 = Invoke-Command -ComputerName $server02 {
cd E:\path\path
sqlplus -s user/pass@instance '@LOB_QUEUE_CHECK.sql'
}
$check02 >> $filePath3\$server02.txt
$CheckFile = Test-Path $filePath2\$file2
if ($CheckFile)
{continue}
else {New-Item -ItemType File -Path $filePath2\$file2}
Get-Content $filePath3\$server01.txt >> $filePath2\$file2
Get-Content $filePath3\$server02.txt >> $filePath2\$file2
问题:当我将它放入PS脚本,并从cmd或PS运行时,我得到了我想要的确切结果,并且没有错误(即使我将其全部复制并直接粘贴到PS命令行)。但是,当我将此脚本设置为由计划任务运行时,我只会获得打印到目标文件的servername($ server01)和time($ t)。我将更新到目前为止我尝试的一些变化(基于TechNet和此处的建议),但遗憾的是到目前为止没有成功。
而且...抱歉这个巨大的帖子......我出生时启用了-vv选项。