Tl; dr: Я озадачен тем, почему мой сценарий не возвращается обратно на компьютер развертывания. У кого-нибудь есть идея, почему?
Мне предоставили EXE и несколько аргументов для установки какого-либо программного обеспечения. Я использую PowerShell Start-Process
для его запуска. Развертывающий компьютер - контроллер домена Win Server 2012, вошел в систему и работает как администратор домена. Испытательные машины - две машины Windows 10 Pro. Все три имеют PS 5.1.
При установке без вывода сообщений взаимодействие с пользователем не требуется. Если я выполняю точную команду локально, через RDP или в pssession, просто набрав c:\Software.exe /silent /arg2removed
, она устанавливается и возвращается, как и ожидалось.
Сценарий работает нормально до определенного момента. Ничего не происходит после Start-Process
внутри Invoke-Command
-ScriptBlock
. В отдельном окне PowerShell я могу использовать Enter-PSSession
для каждого из двух клиентских компьютеров, а Get-Service
и Get-Process
- оба, соответственно, отображают службу программного обеспечения и фоновые процессы. Я могу Ctrl + c на компьютере развертывания и вернуться к приглашению. Об ошибках в любое время не сообщается.
Вот фрагмент Start-Process
. Я прочитал справку, и это не похоже на то, что мне не хватает ничего, что позволило бы ScriptBlock завершить sh. Если я добавлю Start-Process
к Write-Host
(как мы все делаем), он отобразит команду, которая будет выполняться, и я вернусь к командной строке на компьютере развертывания.
# Start the installer.
Start-Process `
-FilePath "C:\${using:SrcExe}" `
-ArgumentList "/SILENT", "/arg2removed" `
-WorkingDirectory C:\ `
-Wait `
-Verbose `
-ErrorAction SilentlyContinue `
-ErrorVariable InstallErrors
Вот большинство из скрипт. Единственные элементы перед Invoke-Command
- это то, где я настраиваю $ComputersToInstallOn
, введите учетные данные (да, я уверен, что они правильные) и укажите путь к EXE.
Invoke-Command `
-ComputerName $ComputersToInstallOn `
-Credential $Creds `
-Verbose `
-ErrorAction SilentlyContinue `
-ErrorVariable InvokeCommErrors `
-ScriptBlock {
# Get and print the destination machine's hostname
$ThisMachine = Get-Content Env:\COMPUTERNAME ; $ThisMachine
# Print the current date and time
Get-Date
# Check if Sentinel processes are running. If not, assume it's not installed.
$S1Procs = get-process sentinel*
if([string]::IsNullOrEmpty($S1Procs)) {
# Sentinel isn't installed. Continue.
# Map a drive letter to $SrcFolder. Not theoretically necessary but Start-Process complains when copying with the UNC path directly.
New-PSDrive `
-Name S `
-PSProvider FileSystem `
-Credential ${using:Creds} `
-Root ${using:SrcFolder} `
-verbose
# List remote folder
Get-ChildItem S:\
# Copy the $SrcExe to C:\
Copy-Item `
-Path "S:\${using:SrcExe}" `
-Destination C:\ `
-Verbose `
-ErrorAction Stop `
-ErrorVariable CopyErrors
# Unmount drive
Remove-PSDrive S -verbose
# Verify EXE exists locally
Get-ChildItem -Path C:\${using:SrcExe}
# If there were copy errors, abort.
if ($CopyErrors) {
Write-Host "There was an error copying '${using:SrcExe}' to $ThisMachine. Aborting."
exit 1 } else {
# All good so far. Continue to install.
Write-Host "$(Get-Date -UFormat '%Y%m%d %H:%M:%S') : Starting install on ${ThisMachine}. You may need to Ctrl+C to return to the local machine. Check processes on each machine though."
# Start the installer.
Start-Process `
-FilePath "C:\${using:SrcExe}" `
-ArgumentList "/SILENT", "/arg2removed" `
-WorkingDirectory C:\ `
-Wait `
-Verbose `
-ErrorAction SilentlyContinue `
-ErrorVariable InstallErrors
# ScriptBlock doesn't seem to make it to anything after Start-Process.
# Remove the EXE.
Remove-Item "C:\${using:SrcExe}" -Verbose -ErrorAction SilentlyContinue
exit 0
# Get-Process -Name Sentinel*
# echo "Sleeping. Now would be the time to abort."
# Start-Sleep 15
}
} else {
Write-Host "Sentinel appears to be installed and running."
$S1Procs
Get-Service -Name Sentinel* | Where-Object { $_.Status -match "Running" }
exit 0
}
}
if($InvokeCommErrors){
Write-Host "There were some errors."
}
EDIT : добавлена запрошенная информация.