使用powershell

时间:2018-04-24 03:28:26

标签: powershell getdate

我正在编写一些PS脚本,使用以下代码将时间记录到文本文件login.txt中:

$logdir = "C:\FOLDER"
$logfile = "$logdir\LastLogin.txt"
$user = $env:USERNAME
$date = Get-Date -Format "dd-MM-yyyy"
if (!(Test-Path $logdir)){New-Item -ItemType Directory $logdir}else{}
if (!(Test-Path $logfile)){New-Item $logfile}else{}
if (Get-Content $logfile | Select-String $user -Quiet){write-host "exists"}else{"$user - $date" | Add-Content -path $logfile}
(Get-Content $logfile) | Foreach-Object {$_ -replace "$user.+$", "$user - $date"; } | Set-Content $logfile

这会在文本文件中创建一个条目,如:

用户名 - 01-01-1999

使用Powershell,我想读取文本文件,将文本文件中的日期01-01-1999与当前日期进行比较,如果差异超过30天,则将UserName提取到稍后要使用的变量在剧本中。

我非常感谢有关如何执行以下操作的任何提示:

  1. 将文本文件中的日期与当前日期进行比较。
  2. 如果差异超过30天,请选择UserName作为变量。
  3. 我真的很感激任何建议。

2 个答案:

答案 0 :(得分:2)

借助具有命名捕获组的RegEx检查文件中的所有日期。

$logdir = "C:\FOLDER"
$logfile = Join-Path $logdir "LastLogin.txt"
$Days = -30
$Expires = (Get-Date).AddDays($Days)

Get-Content $logfile | ForEach-Object {
  if ($_ -match "(?<User>[^ ]+) - (?<LastLogin>[0-9\-]+)") {
    $LastLogin = [datetime]::ParseExact($Matches.LastLogin,"dd-MM-yyyy",$Null)
    if ( $Expires -gt $LastLogin ) {
      "{0} last login {1} is {2:0} days ago" -F $Matches.User, $Matches.LastLogin,
         (New-TimeSpan -Start $LastLogin -End (Get-Date) ).TotalDays
    }
  }
}

示例输出

username last login 31-12-1999 is 6690 days ago

答案 1 :(得分:0)

使用regex(正则表达式)可以做到这一点。我将假设您在文本文件中获得的username.(dot)分开。例如,用户名看起来像john.doejason.smith等。文本文件中的条目看起来像john.doe - 01-01-1999jason.smith - 02-02-1999。记住这些事情我们的方法是 -

  1. 使用正则表达式,我们会将usernamedate entry合并为一个变量。
  2. 接下来,我们将步骤1中的模式分为两部分,即username部分和date部分。
  3. 接下来我们选择日期部分,如果差异超过30天,我们将采用其他部分(username)并将其存储在变量中。
  4. 所以代码看起来像这样 -

    $arr = @() #defining an array to store the username with date
    $pattern = "[a-z]*[.][a-z]*\s[-]\s[\d]{2}[-][\d]{2}[-][\d]{4}" #Regex pattern to match entires like "john.doe - 01-01-1999"
    
    Get-Content $logfile | Foreach {if ([Regex]::IsMatch($_, $pattern)) {
               $arr += [Regex]::Match($_, $pattern)
                }
            }
    $arr | Foreach {$_.Value} #Storing the matched pattern in $arr
    
    
    $UserNamewithDate = $arr.value -split ('\s[-]\s') #step 2 - Storing the username and date into a variable.
    
    $array = @() #Defining the array that would store the final usernames based on the time difference.
    
    for($i = 1; $i -lt $UserNamewithDate.Length;)
    {
        $datepart = [Datetime]$UserNamewithDate[$i] #Casting the date part to [datetime] format
        $CurrentDate = Get-Date
        $diff = $CurrentDate - $datepart
        if ($diff.Days -gt 30)
        {
            $array += $UserNamewithDate[$i -1] #If the difference between current date and the date received from the log is greater than 30 days, then store the corresponding username in $array
        }
        $i = $i + 2
    }
    

    现在,您可以访问$array[0]$array[1]等用户名。希望有所帮助!

    注意 - 正则表达式模式将根据您的用户名定义的格式进行更改。 Hereregex library,可能会对您有所帮助。