【问题标题】:Why am I getting the warning "The variable 'lastUpdate' is assigned but never used." in this PowerShell为什么我收到警告“变量 'lastUpdate' 已分配但从未使用过。”在这个 PowerShell
【发布时间】:2019-07-15 04:28:39
【问题描述】:

在这段代码中,我收到了来自 PSScriptAnalyzer 的“UseDeclaredVarsMoreThanAssignments”警告

$lastUpdate = $false;
$shouldUpdate = $false;
if (Test-Path $logfile) {
    (Get-Content $logfile) | Where-Object {
        $_ -match "([^-]*)->\s*UpdateCheck"
    } | ForEach-Object {
        $lastUpdate = $Matches[1]
    }
    if ($lastUpdate) {
        $shouldUpdate = (Get-Date $Matches[1]) -lt ((Get-Date).AddDays(-7))
    } else {
        $shouldUpdate = $true;
    }
} 

触发警告的变量是这一行中的$lastUpdate

$lastUpdate = $Matches[1]

尽管它被用于下一行。

这是我的代码的问题 - 我猜它与范围和 ForEach-Object 循环有关 - 还是 VSCode 中的 PSScriptAnalyzer 有问题?

【问题讨论】:

  • 我为ShouldUpdate$LastUpdate 显示了相同的错误“未使用”消息。对我来说,它看起来像一个错误。我的设置 >>> VSC = 1.36.1 & posh ext = 2019.5.0 & posh = 5.1 & os = win7x64 ///// 它也显示在我的许多其他脚本中。
  • 我在问题 #1164 下报告了相同的错误,据我所知 PSScriotAnalyzer 应该排除在当前范围内运行的所有标准 cmdlet。

标签: powershell visual-studio-code scope


【解决方案1】:

正如评论中提到的,该错误发布在#1164

作为一种解决方法,您可以考虑使用ForEach 语句而不是ForEach-Object cmdlet(请参阅:Difference between ForEach and ForEach-Object in powershell):

ForEach ($Item in ((Get-Content $logfile) | Where-Object {$_ -match "([^-]*)->\s*UpdateCheck"})) {
    $lastUpdate = $Matches[1]
}

在您的情况下,您甚至可以将您的陈述简化为:

$lastUpdate = (Get-Content $logfile) | Where-Object {$_ -match "([^-]*)->\s*UpdateCheck"}

在此示例中,$lastUpdate 指的是一组匹配项,如果它包含一个或多个项目,它将转换为 $True,如果它不包含任何匹配项,则转换为 $False

【讨论】:

  • 哇,我什至不知道 forEach ≠ ForEach-Object。谢谢。就第二个 sn-p 而言,我希望 $lastUpdate 等于日志文件中匹配的最后一个实例,如果有多个匹配项,sn-p 会正常工作吗?
  • 是的,应该的,我已经为答案添加了一些解释。
  • 谢谢,这比解决方法要好,这是一种改进。所以我可以使用$lastUpdate = (Get-Content $logfile) | Where-Object {$_ -match "([^-]*)->\s*UpdateCheck"}; if ($lastUpdate){$lastupdate = $lastUpdate[-1]}
猜你喜欢
  • 2016-05-21
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多