我正在构建一个脚本来监控PowerShell中的Ahsay备份,并且遇到了识别备份类型的问题,它通过检查日志文件的前几行中的某些关键字来工作,我希望如此如果它包含单词“文件列表”但也包含单词“数据库”,则它不会记录为文件类型备份 - 下面的代码(变量$ LogType包含正在搜索的文本):
get-childitem -Exclude *Scheduler*, *SystemTray*, *Archived*,*System*| select -last 1 | Get-Content -totalcount 13 -outvariable LogType
if($LogType -notlike "*Database*" -and $LogType -like "*file list*")
{
...
}
返回true,并在搜索的文本为:
时执行if语句[2018/01/14 19:30:06] [info] Start [ Windows Server 2008 R2 (FS1), AhsayOBM 6.27.0.0 ]
[2018/01/14 19:30:10] [info] Using Temporary Directory C:\Users\systemadmin\.temp
[2018/01/14 19:30:10] [info] Start running pre-commands
[2018/01/14 19:30:10] [info] Finished running pre-commands
[2018/01/14 19:30:11] [info] Start creating Shadow Copy Set ...
[2018/01/14 19:30:21] [info] Shadow Copy Set successfully created Database
[2018/01/14 19:30:21] [info] Downloading server file list ...
[2018/01/14 19:36:44] [info] Downloading server file list ... Completed
[2018/01/14 19:36:45] [info] Reading backup source from hard disk
...
我无法理解为什么会这样,有人可以帮忙吗?
答案 0 :(得分:0)
我相信这是PowerShell有点太有帮助的情况。
Get-Content
默认输出一个字符串数组,每行一个字符串。
当与集合一起使用时,比较运算符的工作方式不同,它们将为每个项目评估一次并返回匹配的每个项目。例如
(0..10) -eq 5
将返回5
PowerShell将很多内容解释为true
,包括一个非空的数组。
基本上,这两个条件对于文件中的至少一行都是正确的,因此该语句在技术上是正确的。解决问题的最简单方法是将文件作为带有-Raw
参数的单个字符串读取。
$LogType = Get-Content $myFile -Raw -TotalCount 13
修改:如果-Raw
和-TotalCount
无法正常协作,您可以使用-TotalCount
并手动合并。
$fileContent = Get-Content $myFile -TotalCount 13
$LogType = $fileContent -join [Environment]::NewLine
答案 1 :(得分:0)
不确定为什么你的' - 不喜欢'没有工作,但我确定它与你的String的评估方式有关,可能是它是一个字符串数组而不是一个完整的字符串(取决于你如何填充它)。作为临时解决方案,当我在我的机器上尝试或至少作为测试时,您可以尝试嵌套2 if语句?也许是这样的事情:
if($LogType -like "*file list*")
{
if ($LogType -like "*Database*") {
...
} else {
...
}
}
答案 2 :(得分:0)
使用
进行管理以使其最终正常工作if($LogType -like "*Database*" -eq $False -and $LogType -like "*file list*")
{
...
}