База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как исправить ошибку «не удается перезаписать переменную PID» в PowerShell?
- В этой теме 1 ответ, 2 участника, последнее обновление 6 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
10 июля 2026 в 10:58 #38145
Хотел чтобы при копировании проверила файлы если одинаковый не копировать и все равно ошибка в скрипте а я еще и не запускал с открытой программой на копии Закрываю 1С копии «Putevki» на сервере…
Исключение при вызове «GetWindowThreadProcessId» с «2» аргументами: «Не удается перезаписать переменную PID, так как он
а является постоянной либо доступна только для чтения.»
\Server2017PutevkiClosePutevki.ps1:27 знак:9
+ [WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nu …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SessionStateUnauthorizedAccessExceptionИсключение при вызове «GetWindowThreadProcessId» с «2» аргументами: «Не удается перезаписать переменную PID, так как он
а является постоянной либо доступна только для чтения.»
\Server2017PutevkiClosePutevki.ps1:27 знак:9
+ [WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nu …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SessionStateUnauthorizedAccessExceptionИсключение при вызове «GetWindowThreadProcessId» с «2» аргументами: «Не удается перезаписать переменную PID, так как он
а является постоянной либо доступна только для чтения.»
\Server2017PutevkiClosePutevki.ps1:27 знак:9
+ [WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nu …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SessionStateUnauthorizedAccessExceptionИсключение при вызове «GetWindowThreadProcessId» с «2» аргументами: «Не удается перезаписать переменную PID, так как он
а является постоянной либо доступна только для чтения.»
\Server2017PutevkiClosePutevki.ps1:27 знак:9
+ [WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nu …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SessionStateUnauthorizedAccessExceptionИсключение при вызове «GetWindowThreadProcessId» с «2» аргументами: «Не удается перезаписать переменную PID, так как он
а является постоянной либо доступна только для чтения.»
\Server2017PutevkiClosePutevki.ps1:27 знак:9
+ [WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nu …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SessionStateUnauthorizedAccessExceptionИсключение при вызове «GetWindowThreadProcessId» с «2» аргументами: «Не удается перезаписать переменную PID, так как он
а является постоянной либо доступна только для чтения.»
\Server2017PutevkiClosePutevki.ps1:27 знак:9
+ [WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nu …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SessionStateUnauthorizedAccessExceptionИсключение при вызове «GetWindowThreadProcessId» с «2» аргументами: «Не удается перезаписать переменную PID, так как он
а является постоянной либо доступна только для чтения.»
\Server2017PutevkiClosePutevki.ps1:27 знак:9
+ [WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nu …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SessionStateUnauthorizedAccessExceptionИсключение при вызове «GetWindowThreadProcessId» с «2» аргументами: «Не удается перезаписать переменную PID, так как он
а является постоянной либо доступна только для чтения.»
\Server2017PutevkiClosePutevki.ps1:27 знак:9
+ [WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nu …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SessionStateUnauthorizedAccessExceptionИсключение при вызове «GetWindowThreadProcessId» с «2» аргументами: «Не удается перезаписать переменную PID, так как он
а является постоянной либо доступна только для чтения.»
\Server2017PutevkiClosePutevki.ps1:27 знак:9
+ [WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nu …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SessionStateUnauthorizedAccessExceptionИсключение при вызове «GetWindowThreadProcessId» с «2» аргументами: «Не удается перезаписать переменную PID, так как он
а является постоянной либо доступна только для чтения.»
\Server2017PutevkiClosePutevki.ps1:27 знак:9
+ [WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nu …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SessionStateUnauthorizedAccessExceptionИсключение при вызове «GetWindowThreadProcessId» с «2» аргументами: «Не удается перезаписать переменную PID, так как он
а является постоянной либо доступна только для чтения.»
\Server2017PutevkiClosePutevki.ps1:27 знак:9
+ [WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nu …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SessionStateUnauthorizedAccessExceptionИсключение при вызове «GetWindowThreadProcessId» с «2» аргументами: «Не удается перезаписать переменную PID, так как он
а является постоянной либо доступна только для чтения.»
\Server2017PutevkiClosePutevki.ps1:27 знак:9
+ [WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nu …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SessionStateUnauthorizedAccessExceptionИсключение при вызове «GetWindowThreadProcessId» с «2» аргументами: «Не удается перезаписать переменную PID, так как он
а является постоянной либо доступна только для чтения.»
\Server2017PutevkiClosePutevki.ps1:27 знак:9
+ [WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Nu …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SessionStateUnauthorizedAccessExceptionКопирую файл 1Cv8.1CD…
-
10 июля 2026 в 10:58 #38146
Ошибка «Не удается перезаписать переменную PID, так как она является постоянной либо доступна только для чтения» возникает из-за того, что переменная $pid объявлена как константа или read-only, и её нельзя передавать по ссылке в [ref].
В PowerShell для передачи параметра по ссылке в вызов нативного метода нужно сначала объявить переменную как обычную, а не как константу.
—
### Как исправить в твоём скрипте:
В функции Get-ProcessWindowTitle перед вызовом
PowerShell1[WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid)нужно объявить $pid как обычную переменную, например:
PowerShell12[int]$pid = 0[WinAPI]::GetWindowThreadProcessId($hwnd, [ref]$pid) | Out-Null—
### Полный исправленный фрагмент функции:
PowerShell12345678910111213141516$callback = [WinAPI+EnumWindowsProc]{param($hwnd, $lParam)if (-not [WinAPI]::IsWindowVisible($hwnd)) { return $true }if ($hwnd -eq [WinAPI]::GetShellWindow()) { return $true }[int]$pid = 0[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}—
### По поводу копирования файлов с проверкой на одинаковость
Если хочешь при копировании файлов проверять, одинаковые ли они, и не копировать, если да — используй сравнение хешей или сравнение размеров и дат.
Пример на PowerShell:
PowerShell12345678910111213141516function Copy-FileIfDifferent {param([string]$Source,[string]$Destination)if (Test-Path $Destination) {$hashSource = Get-FileHash $Source$hashDest = Get-FileHash $Destinationif ($hashSource.Hash -eq $hashDest.Hash) {Write-Host "Файлы одинаковые, копирование пропущено: $Source"return}}Copy-Item -Path $Source -Destination $Destination -ForceWrite-Host "Файл скопирован: $Source"}—
Если нужно, могу помочь собрать полный скрипт для закрытия 1С и копирования с проверкой.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.