Проблема с удаленной установкой проигрывателя PowerShell для Adobe fla sh - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь разработать сценарий с PowerShell для удаленной установки / обновления проигрывателя sh для нескольких компьютеров. Независимо от того, что я делаю, я не могу заставить установку работать должным образом. Я очень ограничен в своих инструментах, поэтому я должен использовать PowerShell и MSI-установку Flashplayer. Я опубликую свой сценарий ниже, любая помощь будет принята с благодарностью.

$Computers = Get-Content C:\Users\name\Desktop\flash.txt

(tried these 3 methods to install none work)
$install = @("/a","/i", "\\$Computer\c$\temp\flash\install_flash_player_32_plugin.msi", "/qn","/norestart")



Invoke-Command -ComputerName $Computer -ScriptBlock {Start-Process "Msiexec" -arg "$using:install" -Wait -PassThru} -Filepath msiexec.exe

    #This returns with "invoke-command: parameter set cannot be resolved using the specified named parameters"

Invoke-Command -ComputerName $computer -ScriptBlock {Start-Process -Filepath msiexec.exe "$using:install" -Wait -PassThru} -Filepath msiexec.exe

    #this returns the same error.

Invoke-Command -ComputerName $Computer -ScriptBlock {start-process msiexec -argumentlist @('/a','/i','"\\$Computer\c$\temp\flash\install_flash_player_32_plugin.msi"','/qn')}

    #this seemingly skips the install entirely. 

Я использовал подобные сценарии для других программ и не имел проблем с их установкой, но ни один из методов, которые я использую или исследовал, не работает должным образом.

1 Ответ

1 голос
/ 09 апреля 2020

Это должно сработать, я объясню, почему это не сработало ниже:

$Computers = Get-Content C:\Users\name\Desktop\flash.txt

$params = '/i <path to AcroPro.msi> LANG_LIST=en_US TRANSFORMS="1033.mst" /qb'

$Computers | % { 
    Invoke-Command -ScriptBlock {
        Param(
            [Parameter(Mandatory=$true,Position=0)]
            [String]$arguments
        )
        return Start-Process msiexec.exe -ArgumentList $arguments -Wait -PassThru
    }  -ComputerName $_ -ArgumentList $params 
}

Итак, это не сработало, потому что ScriptBlock на Invoke-Command не может видеть переменные, которые вы ' Если вы объявили о своем сеансе PowerShell, подумайте, что вы идете на этот удаленный компьютер и вводите этот код вручную, у вас не будет значения (метафоры).

Я сделал еще несколько изменений:

  1. Я переместил все параметры в одну строку, нет необходимости иметь их в массиве.
  2. Добавлен $Computers | в перебирайте имена компьютеров.
  3. Удален FilePath, так как он предназначен для другого использования, документация (Пример # 1).
  4. Установите для $MinutesToWait любое количество минут вы хотите.
  5. Не нужно пытаться передать msiexe c, так как он идет с windows по умолчанию путь "C: \ WINDOWS \ system32 \ msiexe c .exe"
  6. Добавлен возврат, хотя он никогда не нужен, но для того, чтобы сделать его более читабельным и показать намерение вернуть выходные данные процесса msiexe c.
  7. Заменен \\$Computer\c$ на C:\ поскольку нет необходимости использовать сетевое соединение, если вы указываете на хост, на котором вы запускаете команду в /

Надеюсь, это поможет, удачи.

РЕДАКТИРОВАТЬ:

Итак, как вы упомянули, конвейерный процесс зависает, у меня была эта проблема в прошлом при создании компьютера. Сценарий ремонта для моего отдела. Я использовал задания для параллельного выполнения установки, поэтому, если есть компьютер, который по какой-то причине работает медленнее или просто зависает и никогда не останавливается, вы можете его идентифицировать, попробуйте выполнить следующие действия, чтобы посмотрите, как это работает, а затем выполните замены:

#region ######## SetUp #######
$bannerInProgress = @"


#######################
#Jobs are still running
#######################
"@
$bannerDone = @"


##################################################
#DONE see results of finished installations bellow
##################################################
"@
#VARS TO SET
$MinutesToWait = 1
$computers = 1..10 | % {"qwerty"*$_} #REPLACE THIS WITH YOUR COMPUTER VALUES (Get-Content C:\Users\name\Desktop\flash.txt)
#endregion

#region ######## Main #######

#Start Jobs (REPLACE SCRIPTBLOCK OF JOB WITH YOUR INVOKE-COMMAND)
$jobs = [System.Collections.ArrayList]::new()
foreach($computer in $computers){
    $jobs.Add(
        (Start-Job -Name $computer -ScriptBlock {
            Param(
                [Parameter(Mandatory=$true, Position=0)]
                [String]$computer
            )
            Sleep -s (Get-Random -Minimum 5 -Maximum 200)
            $computer
        } -ArgumentList $computer)
    ) | Out-Null
}

$timer = [System.Diagnostics.Stopwatch]::new()
$timer.Start()
$acceptedWait = $MinutesToWait * 60 * 1000 # mins -> sec -> millis
$running = $true
do {
    cls
    $jobsRunning = $jobs | Where-Object State -EQ 'Running'
    if ($jobsRunning) {
        Write-Host $bannerInProgress
        foreach ($job in $jobsRunning) {
            Write-Host "The job `"$($job.Name)`" is still running. It started at $($job.PSBeginTime)"
        }
        Sleep -s 3
    } else {
        $running = $false
    }

    if($timer.ElapsedMilliseconds -ge $acceptedWait){
        $timer.Stop()
        Write-Host "Accepted time was reached, stopping all jobs still pending." -BackgroundColor Red
        $failed = @()
        foreach($job in $jobsRunning){
            $output = $job | Receive-Job
            $failed += [PsCustomObject]@{
                            "ComputerName" = $job.Name;
                            "Output" = $output;
                        }
            $job | Remove-Job -Force
            $jobs.Remove($job)
        }
        $failed | Export-Csv .\pendingInstallations.csv -NoTypeInformation -Force
        $running = $false
    }

}while($running)

Write-host $bannerDone
$results = @()
foreach($job in $jobs){
    $output = $job | Receive-Job
    $results += [PsCustomObject]@{
                    "ComputerName" = $job.Name;
                    "Output" = $output;
                }
}
$results | Export-Csv .\install.csv -NoTypeInformation -Force
#endregion

Этот сценарий вызовет 10 заданий, которые только ждут и возвращают свои имена, затем задания, выполненные за заданное вами время, считаются правильными, и те, которые не считаются ожидающими рассмотрения, обе группы экспортируются в CSV для проверки. Вам нужно заменить следующее, чтобы работать так, как вы предполагали:

  1. Добавить $params = '/i <path to AcroPro.msi> LANG_LIST=en_US TRANSFORMS="1033.mst" /qb' в области настроек
  2. Заменить объявление $computers на $computers = Get-Content C:\Users\name\Desktop\flash.txt
  3. Замените тело Start-Job скриптового блока на Invoke-command из первого фрагмента кода в этом ответе.

Вы должны получить что-то вроде:

.
.code
.
$params = '/i <path to AcroPro.msi> LANG_LIST=en_US TRANSFORMS="1033.mst" /qb'
#VARS TO SET
$MinutesToWait = 1
$computers = Get-Content C:\Users\name\Desktop\flash.txt
#endregion

#region ######## Main #######

#Start Jobs
$jobs = [System.Collections.ArrayList]::new()
foreach($computer in $computers){
    $jobs.Add(
        (Start-Job -Name $computer -ScriptBlock {
            Param(
                [Parameter(Mandatory=$true, Position=0)]
                [String]$computer
            )
            Invoke-Command -ScriptBlock {
                Param(
                    [Parameter(Mandatory=$true,Position=0)]
                    [String]$arguments
                )
                return Start-Process msiexec.exe -ArgumentList $arguments -Wait -PassThru
            }  -ComputerName $computer -ArgumentList $params 
        } -ArgumentList $computer)
    ) | Out-Null
}
.
. code
.

Я знаю, это выглядит как полный беспорядок, но это работает. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...