Вывод имени базы в заголовок конфигуратора средствами Windows (Powershell), без использования сторонних утилит. Может пригодиться на проектах, где запрещено использование стороннего ПО, что не позволяет применять решения на базе AutoIt из предыдущих публикаций:
- Изменение заголовка окна конфигуратора 1С
- Шильдик. Изменение заголовка конфигуратора 1С и выделение цветом конфигураторов разных баз
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class User32 {
[DllImport("user32.dll", SetLastError = true)]
public static extern bool SetWindowText(IntPtr hWnd, string lpString);
}
"@
while ($true) {
# Получаем все процессы 1cv8 и 1cv8c
$appProcesses = Get-Process -Name "1cv8", "1cv8c" -ErrorAction SilentlyContinue
# Устанавливаем заголовок для каждого процесса
foreach ($process in $appProcesses) {
$hwnd = $process.MainWindowHandle
if ($hwnd -ne 0) {
# Получаем командную строку процесса
try {
$commandLine = (Get-WmiObject Win32_Process -Filter "ProcessId = $($process.Id)").CommandLine
# Извлекаем название информационной базы
$databaseName = $null
# Проверка для старого формата командной строки
if ($commandLine -match '/IBName"([^"]+)"') {
$databaseName = $matches[1]
}
# Проверка для нового формата командной строки
if ($commandLine -match 'Ref=""([^""]+)""') {
$databaseName = $matches[1]
}
# Проверка для варианта аргумента командной строки /S"<ИмяСервера>\<ИмяБазы>"
if ($commandLine -match '\/S"([^\\]+)\\([^"]+)"') {
$databaseName = $matches[2] # Имя базы будет во второй группе
}
# Если база не определена, продолжаем к следующему процессу
if (-not $databaseName) {
continue
}
# Проверяем командную строку на вхождение "DESIGNER"
$isDesigner = $commandLine -like "*DESIGNER*"
# Добавляем " (тк)" к имени базы, если это процесс 1cv8.exe и не DESIGNER
if ($process.ProcessName -eq "1cv8" -and -not $isDesigner) {
$databaseName += " (тк)"
}
# Получаем текущий заголовок окна
$currentTitle = (Get-Process -Id $process.Id).MainWindowTitle
# Проверяем, содержит ли заголовок имя базы или был ли заголовок пустым
if (-not ($currentTitle -like "$databaseName*") -and -not $currentTitle -eq "") {
# Устанавливаем новый заголовок окна
$newTitle = "$databaseName - $currentTitle"
[User32]::SetWindowText($hwnd, $newTitle.Trim())
}
} catch {
Write-Host "Не удалось получить командную строку для процесса с ID $($process.Id)"
}
}
}
# Ждем 250 миллисекунд
Start-Sleep -Milliseconds 250
}
Также добавлен вывод имени базы в заголовок окна режима предприятия, также добавляется отметка " (тк)" для режима толстого клиента. Скрипт можно запускать копипастом в консоли Powershell или в виде файла. Для выполнения через файл требуется заранее включить разрешение следующей командой "Set-ExecutionPolicy RemoteSigned -Scope CurrentUser" (требуется обратить внимание на вопрос безопасности такого разрешения).
Для корректной работы скрипта в командной строке процесса 1cv8.exe (1cv8c.exe) должен быть параметр с именем информационной базы: /IBase"<ИмяБазы>", /IBConnectionString"Srvr=""<ИмяСервера>"";Ref=""<ИмяБазы>"";" или /S"1c-erp-dev1\vdgb_dev14", который обычно присутствует.
Тестирование выполнялось на платформе 1С:Предприятие 8.3 (8.3.24.1548).