Здравствуйте! Я работаю над скриптом для Export почтовых ящиков в формате PST на Exchange. У меня уже есть форма, в которой отображаются все почтовые ящики, есть кнопка для получения объема каждого ящика и вторая кнопка для экспорта — это уже работает. В процессе доработки я добавил два календаря для указания диапазона дат.
Я использую следующий код для создания календарей:
```powershell
$calendarFrom = New-Object Windows.Forms.MonthCalendar -Property @{
ShowTodayCircle = $false
MaxSelectionCount = 1
Location = New-Object Drawing.Point 28, 210
Size = New-Object Drawing.Size 75, 23
}
$frmMain.Controls.Add($calendarFrom)
$calendarTill = New-Object Windows.Forms.MonthCalendar -Property @{
ShowTodayCircle = $false
MaxSelectionCount = 1
Location = New-Object Drawing.Point 268, 210
Size = New-Object Drawing.Size 75, 23
}
$frmMain.Controls.Add($calendarTill)
```
В качестве основы я использую следующую команду:
```powershell
New-MailboxExportRequest -Mailbox form -FilePath \\mail.company.ru\mailpst\mailbox_apr_jun_2024@company.ru.pst -ContentFilter "(Received -ge '04/01/2024 00:00:00') -and (Received -lt '06/30/2024 00:00:00')"
```
Однако, при передаче значений из календарей в команду экспорта, как показано здесь:
```powershell
$MailboxExport = New-MailboxExportRequest -Mailbox $LogonName -FilePath $savePath -ContentFilter "(Received -ge $calendarFrom.SelectionStart) -and (Received -lt $calendarTill.SelectionStart)"
```
Я получаю сообщение об ошибке, указывающее на неправильное значение переменной. Кажется, что даты из календарей выбираются в формате 'mm/dd/yyyy hh:mm:ss', и я не понимаю, что именно я упустил. Буду благодарен за любые подсказки!
Ваша проблема заключается в том, как вы пытаетесь вставить значения из календарей в строку контент-фильтра. Конструкция, которую вы используете: `"(Received -ge $calendarFrom.SelectionStart) -and (Received -lt $calendarTill.SelectionStart)"`, создает строку, но PowerShell не подставляет значения переменных так, как вы ожидаете.
В данном случае вам нужно создать строку фильтра с правильной интерполяцией переменных. Вы можете сделать это, используя `-f` для форматирования строки, или конструируя строку с помощью методов. Вот пример, как это можно сделать:
```powershell
$fromDate = $calendarFrom.SelectionRange.Start
$toDate = $calendarTill.SelectionRange.Start
# Преобразование даты в строку нужного формата
$fromDateString = $fromDate.ToString("MM/dd/yyyy HH:mm:ss")
$toDateString = $toDate.ToString("MM/dd/yyyy HH:mm:ss")
$ContentFilter = "(Received -ge '$fromDateString') -and (Received -lt '$toDateString')"
$MailboxExport = New-MailboxExportRequest -Mailbox $LogonName -FilePath $savePath -ContentFilter $ContentFilter
```
### Что здесь происходит:
1. **Получение выбранных дат**: `$calendarFrom.SelectionRange.Start` и `$calendarTill.SelectionRange.Start` получают начальные временные метки из выбранного диапазона календаря.
2. **Форматирование даты**: Метод `.ToString("MM/dd/yyyy HH:mm:ss")` используется для приведения даты к нужному формату. Важно учесть, что формат должен совпадать с форматом, принимаемым командлетом `New-MailboxExportRequest`.
3. **Создание фильтра**: Фильтр создается с использованием интерполяции строк, чтобы подставить подготовленные строки с датами.
Эти изменения помогут вам передать значения дат из календарей в команду экспорта без возникновения ошибок с неверным форматом даты.
Неохота разбираться с формами, но работать с датами надо не полагаясь на дефолты, которые зависят от локали.
Просто используйте универсальные работающие варианты$date.ToString('yyyy-MM-dd HH:mm:ss')