【问题标题】:Powershell: File date/time stamp check, need to output to exit codePowershell:文件日期/时间戳检查,需要输出退出代码
【发布时间】:2014-01-14 02:50:40
【问题描述】:

我将自定义代码部署到数以千计的计算机上,并且已经能够让返回代码为我必须用来推出代码的工具中的一两个对象正确运行。但我正在寻找一种设置文件验证器的方法 - 因为开发人员不会始终使用版本编号,所以我能够使用下面的代码来检查每个对象的日期戳。

代码:

$foo1= Get-ChildItem "C:\path\file1.exe" | Where-Object {$_.LastWriteTime -gt "11/1/2013"} | Out-String
$foo2= Get-ChildItem "C:\path\file2.exe" | Where-Object {$_.LastWriteTime -gt "9/10/2013"} | Out-String
$foo3= Get-ChildItem "C:\path\file3.exe" | Where-Object {$_.LastWriteTime -gt "4/23/2013"} | Out-String
$foo4= Get-ChildItem "C:\path\file4.exe" | Where-Object {$_.LastWriteTime -gt "12/17/2012"} | Out-String

上述方法有效,但会显示对象名称和上次写入时间。我可以用这段代码编写退出代码:

if($foo1){Write-Host '0'
}else{
Write-Host '5'
Exit 5 
}

有没有一种方法可以说明 foo1 是否存在(即不是 $null),然后将其读取为 0,如果它为 null,则将其读取为 1,然后声明 $foochecksum = $foo1 + $foo2 + $foo3 + $foo4 并执行一次上面引用的 If Else 以将退出代码写入我的部署工具?

从功能上讲,我正在寻找一种检查多个文件日期/时间戳的方法,然后如果一切正常,则将一个 0 传递给 If/Else 语句,该语句将向我的部署工具写入通过或失败。

如果需要,我可以使用多个 if/else,但需要检查 40 个文件之类的内容,并且不希望有 40 个不同的 IF/Else 语句。

我也希望有一些可以在 PS V2 和 V3 中运行的东西,因为我在产品中混合了 2003 和 2008 的服务器。

谢谢,

德怀特

【问题讨论】:

    标签: powershell


    【解决方案1】:

    使用变量来保存脚本的“错误状态”,并使用HashTable 来保存您正在“测试”的每个文件的PathLastWriteTime 值。

    $ErrorExists = $false;
    
    # Declare some file/lastwritetime pairs
    $FileList = @{
            1 = @{ Path = 'C:\path\file1.exe';
            LastWriteTime = '11/1/2013'; };
            2 = @{ Path = 'C:\path\file2.exe';
            LastWriteTime = '9/10/2013'; };
            3 = @{ Path = 'C:\path\file3.exe';
            LastWriteTime = '4/23/2013'; };
            4 = @{ Path = 'C:\path\file4.exe';
            LastWriteTime = '12/17/2012'; };
            };
    
    foreach ($File in $FileList) {
        # If LastWriteTime is LESS than the value specified, raise an error
        if ((Get-Item -Path $File.Path).LastWriteTime -lt $File.LastWriteTime) {
            $ErrorExists = $true;
        }
    }
    
    if ($ErrorExists) {
        # Do something
    }
    

    【讨论】:

    • 让我试试这个 - 这让我更接近我想要做的事情 - 我正在通过 LANDesk 进行管道传输,并且拥有自定义错误代码让我们能够准确地找出缺失的地方 - 长期的方法工作和运行速度非常快,但我是 PowerShell 新手,我正在看看是否有更快的方法。
    【解决方案2】:

    也许是这样的?

    $foos = &{
    Get-ChildItem "C:\path\file1.exe" | Where-Object {$_.LastWriteTime -gt "11/1/2013"} | select -last 1
    Get-ChildItem "C:\path\file2.exe" | Where-Object {$_.LastWriteTime -gt "9/10/2013"}  | select -last 1
    Get-ChildItem "C:\path\file3.exe" | Where-Object {$_.LastWriteTime -gt "4/23/2013"} | select -last 1
    Get-ChildItem "C:\path\file4.exe" | Where-Object {$_.LastWriteTime -gt "12/17/2012"} | select -last 1
    }
    
    if ($foos.count -eq 4) {Write-Host '0'}
    else {Write-Host '5';Return '5'}
    

    【讨论】:

    • 让我试试这个 - 这让我更接近我想要做的事情 - 我正在通过 LANDesk 进行管道传输,并且拥有自定义错误代码让我们能够准确找出缺失的地方 - 长期方法工作和运行速度非常快,但我是 PowerShell 新手,我正在看看是否有更快的方法。
    • 你运行的是什么 Powershell 版本?
    • 必须运行 V2 和 V3 - 2003 服务器和 2008 服务器是目标
    • 这很好用 - 能够进一步分离文件夹中的多个检查,以检查重要的 exe 和 dll 是否有不同的错误。在 5 分钟内运行 600 台服务器 - 并且能够修复 60 台与 prod 上的内容不同步的问题。谢谢,这有很大帮助!
    • 很高兴它对你有用。请务必将其标记为已回答,这样它就不会永远留在未回答的问题中。
    猜你喜欢
    • 2018-03-21
    • 2015-02-06
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 2012-10-28
    • 2012-06-13
    相关资源
    最近更新 更多