Общая вещь, которую мне нужно много сделать с файлами, - это создать/сослаться на резервную версию файла. например, я мог бы захотеть иметь версию файла с отметкой даты/времени, чтобы я мог ссылаться как на исходный отчет, так и на резервную версию в сценарии:
$now = $(Get-Date -format "yyyy-MM-dd__HH-mm")
$ReportName = "MyReport-en.csv"
$Backups = "D:\Backups\Reports"
Я обнаружил, что использование -joinили +всегда вставка пробела перед отметкой даты/времени:
$ReportBackup = "$Backups\$($ReportName -split ".csv")" + "_$now.csv"
$ReportBackup = "$Backups\$($ReportName -split ".csv")" -join "_$now.csv"
Я нашел способ сделать это, но он выглядит неэффективным с тройкой $и дублированием.csv
$ReportBackup = "$Backups\$($($ReportName -split ".csv")[0])$_now.csv"
что приводит к:
$ReportBackup => D:\Backups\Reports\MyReport-en_2022-04-15__07-55.csv
Можете ли вы придумать более простой/чистый способ достижения общей цели вставки фрагмента текста перед расширением без тройного $или дублирования расширения? («Использовать $name = "MyReport-en"«» не так полезно, потому что часто я читаю файловый объект и получаю имя с расширением.
Решение проблемы
$now = Get-Date -Format "yyyy-MM-dd__HH-mm"
$reportName = "MyReport-en.csv"
$backups = "D:\Backups\Reports"
$reportBackup = Join-Path $backups $reportName.Replace(".csv","_$now.csv")
$reportBackup
PS Нет никаких рисков использования .Replace(), если вы знаете, как это работает. Этот метод чувствителен к регистру и заменяет все вхождения. В данном конкретном случае мы заранее точно знаем имя, поэтому можем безопасно использовать этот метод.
Название «My.csvReport-en.csv» — это ерунда, но если бы проблема явно относилась к универсальному решению «любое-имя.ext»:
$reportName = "My.aSd_Report-en.aSD"
$backups = "D:\Backups\Reports"
$reportBackup = Join-Path $backups ($reportName -replace "(?=\.[^.]+$)", (Get-Date -Format "_yyyy-MM-dd__HH-mm"))
$reportBackup
Комментариев нет:
Отправить комментарий