【问题标题】:Issue with searching for strings in text in Powershell在 Powershell 中搜索文本中的字符串的问题
【发布时间】:2018-06-24 00:23:58
【问题描述】:

我正在构建一个脚本以在 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

...

我无法理解为什么会这样,有人可以帮忙吗?

【问题讨论】:

  • 你在$LogType 中得到了什么?你如何填充它? (请编辑问题并填写详细信息,不要在评论中回答。这些很难阅读。)
  • 你应该添加一些变量$LogType的内容信息。在您的问题中键入“文件列表”,然后在脚本中将其更改为“文件列表”。请注意不同的外壳。也许使用$LogType.ToUpper() -notlike "*DATABASE*" -and $LogType.ToUpper() -like "*FILE LIST*"

标签: regex powershell scripting backup


【解决方案1】:

我相信这是 PowerShell 有点太有用的例子。

  1. Get-Content默认输出一个字符串数组,每行一个字符串。

  2. 比较运算符与集合一起使用时的工作方式不同,它们将对每个项目进行一次评估并返回每个匹配的项目。例如

    (0..10) -eq 5

    将返回5

  3. PowerShell 将很多东西解释为true,包括一个非空数组。

基本上,对于文件中的至少一行,这两个条件都为真,因此该陈述在技术上是正确的。解决此问题的最简单方法是使用 -Raw 参数将文件作为单个字符串读取。

$LogType = Get-Content $myFile -Raw -TotalCount 13

编辑:如果-Raw-TotalCount 不能正确协同工作,您可以使用-TotalCount 并手动组合。

$fileContent = Get-Content $myFile -TotalCount 13
$LogType = $fileContent -join [Environment]::NewLine

【讨论】:

  • 可悲的是 -Raw 和 -TotalCount 玩得不好!我尝试将其输出到文件中,然后将其作为原始文件读取,但仍然没有运气
  • @TomHalverson 更新了第二步,手动将它们连接成一个字符串。
【解决方案2】:

不知道为什么你的'-notlike'不起作用,但我确信它与你的字符串被评估的方式有关,它可能是一个字符串数组而不是一个完整的字符串(取决于你如何填充它)。作为我在我的机器上尝试的临时解决方案,或者至少作为测试,您是否可以尝试嵌套 2 个 if 语句?可能是这样的:

if($LogType -like "*file list*")
{
   if ($LogType -like "*Database*") {
    ...
   } else {
    ...
   }
}

【讨论】:

  • 似乎以这种方式工作 - 奇怪的是 -notlike 没有工作
  • 我很高兴你得到它的工作,如果你不介意,请投票给对你有用的答案。快乐的脚本!
【解决方案3】:

最终通过使用

使其正常工作
if($LogType -like "*Database*" -eq $False -and $LogType -like "*file list*")
{
...
}

【讨论】:

    猜你喜欢
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2011-09-13
    • 1970-01-01
    • 2014-11-18
    • 2023-02-21
    • 2018-02-14
    相关资源
    最近更新 更多