Я пытаюсь выполнить существующий скрипт на удаленном сервере и захватить вывод в локальном файле

StackOverflow https://stackoverflow.com//questions/24055009

Вопрос

Я хочу запустить это на нескольких серверах (почти 40-50 серверов) параллельно

$ username="Пользователь"

$Password = "Password"

$servers = get-content "c:\temp\servers.txt"

$sb = {c:\temp\PsExec.exe -h \\$server -u $Username -p $password cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$env:userprofile\Desktop\output.txt"} 

foreach($server in $servers)
{
    start-job -ScriptBlock $sb
}
.

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

Я не могу использовать PSSession или Invoke-команду, поскольку она ограничена в нашей среде.

Этот код никогда не выходит.Он останавливается в этой позиции:

 + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com
.

Это было полезно?

Решение

Для начала вы не проходите ни одной из ваших переменных в работу.То, что вам нужно, это использовать переменную $ Args в ScriptBlock, а затем пройти переменные, которые вы хотите с -argumentList.

$Password = "Password"

$servers = get-content "c:\temp\servers.txt"

$sb = {
  c:\temp\PsExec.exe -h \\$args[0] -u $args[1] -p $args[2] cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$args[3]\Desktop\output.txt"
} 

foreach($server in $servers)
{
    start-job -ScriptBlock $sb -ArgumentList $server,$Username,$password,$env:userprofile
}
.

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

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

$Password = "Password"

$servers = get-content "c:\temp\servers.txt"

$sb = {
  Param ($Server,$UserName,$Password,$UserProfile)

  c:\temp\PsExec.exe -h \\$Server -u $UserName -p $Password cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$UserProfile\Desktop\output.txt"
} 

foreach($server in $servers)
{
    start-job -ScriptBlock $sb -ArgumentList $server,$Username,$password,$env:userprofile
}
.

Я надеюсь, что это поможет. Ура, Крис.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top