Я собрал воедино сценарий PowerShell, который запускается (через планировщик задач) при каждом перезапуске компьютера.
Этот сценарий выполняет следующие действия:
- Найдите файл csv, расположенныйв определенном каталоге
- Переименуйте файл, добавив отметку времени / даты в конец
- Переместите этот файл в папку архива
В течение дня программное обеспечениеПриложение автоматически создает новый CSV-файл.Поэтому в следующий раз, когда компьютер перезагрузится, он повторяет шаги, описанные выше.
Последний шаг - скрипт также просматривает папку архива и удаляет все файлы, возраст которых> 7 дней.
Иногда (не все время), когда компьютер перезагружается и скрипт запускается,он выполняет шаги 1 и 2, но не шаг 3. И что это означает, что файл csv переименован, но сценарий НЕ перемещает его в папку архива.
Почему?Я открываю сценарий в PowerShell ISE и запускаю сценарий вручную, и вижу причину: файл с таким именем уже существует в папке архива.
Как это может произойти, если имя файла всегда динамически переименовывается с использованиемотметка даты / времени (с точностью до секунды).
Оказывается, переменная, которой присвоено значение Get-Date, не обновляется.Он по-прежнему содержит старое время.
Почему это происходит, если первое, что я делаю в своем скрипте PowerShell, это: $ rightNow = Get-Date
Я знаю, что это не лучшая практикаприсвойте текущую дату и время переменной, и, очевидно, переменная не будет обновляться сама по себе с каждой секундой.Все в порядке.Мне это не нужно.Чего я действительно ожидаю, так это получения текущей даты и времени (во время выполнения этой строки кода) и присваивания его моей переменной с именем $ 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
}