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

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

$Имя пользователя = пользователь

$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
}

этот код отлично работает, если я удаляю start-job, но выполняется один за другим, что занимает много времени.

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

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

 + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
 
PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

person Chand    schedule 05.06.2014    source источник
comment
зачем использовать powershell для запуска psexec для запуска powershell? Вам нравится сложность? не могли бы вы сделать что-то вроде icm -ComputerName servername -scriptblock { invoke-expression c:\script.ps1} -asjob   -  person Loïc MICHEL    schedule 05.06.2014
comment
@Kayasax ## если я использую приведенное выше выражение, я получаю следующую ошибку ## Не удалось подключиться к удаленному серверу со следующим сообщением об ошибке: Клиент WinRM не может обработать запрос. Если схема аутентификации отличается от Kerberos или если клиентский компьютер не присоединен к домену, необходимо использовать транспорт HTTPS или добавить конечный компьютер в параметр конфигурации TrustedHosts. Используйте winrm.cmd для настройки TrustedHosts. Обратите внимание, что компьютеры в списке TrustedHosts могут не пройти проверку подлинности.   -  person Chand    schedule 06.06.2014
comment
Я забыл упомянуть... Я работаю с powershell 2.0.   -  person Chand    schedule 06.06.2014
comment
Сначала вам нужно будет включить удаленное взаимодействие на целевом компьютере. см. technet.microsoft.com/en-us/magazine/ff700227.aspx   -  person Loïc MICHEL    schedule 06.06.2014
comment
@Kayasax enable remoting ограничен нашими клиентами, поэтому я использую psexec.... PSexec отлично работает, когда я запускаю один за другим, но если я пытаюсь запустить параллельно, он не поддерживает....   -  person Chand    schedule 06.06.2014


Ответы (1)


Для начала вы не передаете ни одну из своих переменных в задание. Что вам нужно, так это использовать переменную $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
}

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

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

$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
}

Надеюсь, это поможет. Здоровья, Крис.

person dwarfsoft    schedule 14.07.2014