我整理了一个PowerShell脚本,每次计算机重新启动时都会触发该脚本(通过Task Scheduler)。
该脚本将执行以下操作:
白天,软件应用程序会自动创建一个新的csv文件。因此,下次计算机重新启动时,它将重复上述步骤。
有时(并非始终)在计算机重新启动并运行脚本时,它会完成步骤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
}
答案 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)
}