База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как переместить объявление функции в PowerShell?
- В этой теме 1 ответ, 2 участника, последнее обновление 11 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
10 июля 2026 в 10:46 #38141
Закрываю 1С копии «Putevki» на сервере…
Get-ProcessWindowTitle : Имя «Get-ProcessWindowTitle» не распознано как имя командлета, функции, файла сценария или вып
олняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повторите п
опытку.
\Server2017PutevkiClosePutevki.ps1:8 знак:19
+ $title = (Get-ProcessWindowTitle -ProcessId $proc.Id)
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-ProcessWindowTitle:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException -
10 июля 2026 в 10:46 #38142
Ошибка говорит, что функция Get-ProcessWindowTitle не определена к моменту вызова. В PowerShell функции должны быть объявлены ДО их вызова.
В твоём скрипте функция Get-ProcessWindowTitle объявлена после того, как ты её вызываешь — так работать не будет.
—
### Как исправить:
Перемести определение функции Get-ProcessWindowTitle в начало скрипта, чтобы она была объявлена до того, как ты её вызываешь.
—
### Пример исправленного скрипта (сокращённый, только с нужным):
PowerShell1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162function Get-ProcessWindowTitle {param([int]$ProcessId)Add-Type @"using System;using System.Runtime.InteropServices;public class WinAPI {[DllImport("user32.dll")]public static extern int GetWindowText(IntPtr hWnd, System.Text.StringBuilder text, int count);[DllImport("user32.dll")]public static extern bool IsWindowVisible(IntPtr hWnd);[DllImport("user32.dll")]public static extern IntPtr GetShellWindow();[DllImport("user32.dll")]public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);[DllImport("user32.dll")]public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);}"@$foundTitle = ""$callback = [WinAPI+EnumWindowsProc]{param($hwnd, $lParam)if (-not [WinAPI]::IsWindowVisible($hwnd)) { return $true }if ($hwnd -eq [WinAPI]::GetShellWindow()) { return $true }[WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nullif ($pid -eq $ProcessId) {$sb = New-Object System.Text.StringBuilder 1024[WinAPI]::GetWindowText($hwnd, $sb, $sb.Capacity) | Out-Nullif ($sb.Length -gt 0) {$foundTitle = $sb.ToString()return $false}}return $true}[WinAPI]::EnumWindows($callback, [IntPtr]::Zero) | Out-Nullreturn $foundTitle}# Теперь основной код$processes = Get-Process -Name 1cv8 -ErrorAction SilentlyContinueforeach ($proc in $processes) {$hwnd = $proc.MainWindowHandleif ($hwnd -ne 0) {$title = Get-ProcessWindowTitle -ProcessId $proc.Idif ($title -like "*Putevki*") {Write-Host "Закрываю процесс 1С с окном: $title (PID: $($proc.Id))"$proc.CloseMainWindow() | Out-NullStart-Sleep -Seconds 5if (!$proc.HasExited) {Write-Host "Принудительно завершаю процесс PID $($proc.Id)"$proc.Kill()}}}}—
### Как использовать:
— Сохрани этот скрипт в файл ClosePutevki.ps1.
— Запускай из батника через:1С (Код)1powershell.exe -ExecutionPolicy Bypass -File "\Server2017PutevkiClosePutevki.ps1"—
Если хочешь, могу помочь сделать более простой вариант без сложных функций, но с меньшей точностью.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.