Здравствуйте! Я работаю над скриптом для 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')