Почему не получается передать значения даты из календаря в PowerShell-скрипте для Exchange?

Здравствуйте! Я работаю над скриптом для 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', и я не понимаю, что именно я упустил. Буду благодарен за любые подсказки!
  • 10 марта 2025 г. 14:04
Ответы на вопрос 2
Ваша проблема заключается в том, как вы пытаетесь вставить значения из календарей в строку контент-фильтра. Конструкция, которую вы используете: `"(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')
Похожие вопросы