将当前时间分配给Powershell变量

时间:2018-09-11 23:23:18

标签: powershell

我整理了一个PowerShell脚本,每次计算机重新启动时都会触发该脚本(通过Task Scheduler)。

该脚本将执行以下操作:

  1. 找到位于特定目录中的csv文件
  2. 通过在末尾附加时间/日期戳来重命名文件
  3. 将该文件移至存档文件夹

白天,软件应用程序会自动创建一个新的csv文件。因此,下次计算机重新启动时,它将重复上述步骤。

  1. 最后一步-该脚本还会在存档文件夹中查找并删除超过7天的所有文件。

有时(并非始终)在计算机重新启动并运行脚本时,它会完成步骤1和2,但不会完成步骤3。 因此,这意味着将csv文件重命名,但是脚本并未将其移至存档文件夹中。

为什么? 我在PowerShell ISE中打开脚本并手动运行该脚本,然后看到了原因: 存档文件夹中已经存在具有该名称的文件。

如果总是使用日期/时间戳(最小到第二个)动态重命名文件名,怎么办?

找出分配了Get-Date值的变量不更新。 它仍然包含着旧时光。

如果我在PowerShell脚本中所做的第一件事是为什么会发生这种情况: $ rightNow =获取日期

我知道,将当前日期和时间分配给变量不是最佳实践,并且显然变量不会随着每秒的更新而更新。没关系。我不需要我希望它做的是获取当前日期和时间(在此行代码运行时),并将其分配给名为$ rightNow的变量。

由于某种原因,变量未更新。 为什么会这样?快速获取当前日期和时间(精确到秒)并将其用作文件名一部分的最佳方法是什么?

这是我当前的脚本:

$source = "C:\Logs"
$destination = "C:\Logs\archive"
$old = 7
$rightNow = Get-Date

# delete all files in the archive folder that are > 7 days old
Get-ChildItem $destination -Recurse |
Where-Object {-not $_.PSIsContainer -and 
$rightNow.Subtract($_.CreationTime).Days -gt $old } |
Remove-Item

# rename all csv files in the Log folder by appending currentDate_currentTime
Get-ChildItem -Path $source\* -Include *.csv  | % {
    $name = $_.Name.Split(".")[0] + "_" + ($_.CreationTime | Get-Date -Format yyyyMMdd) + "_" + ($_.CreationTime | Get-Date  -Format hhmmss) + ".csv"
    Rename-Item $_ -NewName $name
    Move-Item "$($_.Directory)\$name" -Destination $destination
}

1 个答案:

答案 0 :(得分:1)

您不使用重命名中的当前日期,而是使用文件的CreationTime属性。如果要使用当前日期时间,请尝试

$name = $_.BaseName + [datetime]::now.ToString('_yyyyMMdd_hhmmss') + $_.Extension

或者更好,只是在移动过程中执行重命名。

$source = "C:\Logs"
$destination = "C:\Logs\archive"
$old = 7

# delete all files in the archive folder that are > 7 days old
Get-ChildItem $destination -Recurse -File |
    Where-Object { $_.CreationTime -lt [datetime]::Today.AddDays(-$old) } |
    Remove-Item

# rename all csv files in the Log folder by appending currentDate_currentTime
Get-ChildItem -Path $source\* -Include *.csv  | % {
    $_ | Move-Item -Dest $("$destination\" + $_.BaseName + [datetime]::now.ToString('_yyyyMMdd_hhmmss') + $_.Extension)
}