2014-01-05 3 views
0

В основном я хочу сделать следующее краткое использованием трубопровода:Произведите несколько ScriptBlock через трубопровод в PowerShell

{Remove-Job 27}, {Remove-Job 29} | % { Invoke-Command -Session $s -ScriptBlock $_; };

Чтобы что-то вроде (концептуально)

@(27, 29) | % {Remove-Job $_;} | % { Invoke-Command -Session $s -ScriptBlock $_; };

Что бы хороший способ сделать это?

ответ

3

Ваш второй пример не совсем прав, потому что вы должны испустить ScriptBlock, чтобы позвонить по нему Invoke-Command. Поэтому вместо того, чтобы на самом деле вызыватьRemove-Job на локальном компьютере, вы должны передать его как ScriptBlock на удаленный компьютер. Вот самый краткий путь я могу думать в тот момент, чтобы добиться того, что вы после:

27, 29 | % { Invoke-Command -Session $s -ScriptBlock { Remove-Job -Id $args[0]; } -ArgumentList $_; }; 

Даже если вы не явно выйти и показать код, это очевидно, что вы заранее создавая объект PowerShell Session (aka. PSSession), перед вызовом Invoke-Command. Вы также можете упростить ситуацию, не создавая PSSession и просто используя Invoke-Command с параметром -ComputerName. Вот пример:

$ComputerList = @('server01.contoso.com', 'server02.contoso.com', 'server03.contoso.com'); 
Invoke-Command -ComputerName $ComputerList -ScriptBlock { Remove-Job -Id $args[0]; } -ArgumentList 27,29; 

Примечание: Я также переехал Job идентификаторы непосредственно в -ArgumentList, а не обжигающе их я вообще стараюсь избегать использования трубопровода PowerShell, если это действительно не имеет смысла (например.. используя Where-Object, Get-Member, или Select-Object). У каждого свой подход.

+0

Спасибо за ответ. Я на самом деле пробовал это раньше, но у меня есть следующая ошибка: '' Невозможно проверить аргумент в параметре 'Id'. Аргумент пустой или пустой. Укажите аргумент , который не является пустым или пустым, а затем повторите попытку. + CategoryInfo: InvalidData: (:) [Remove-Job], ParameterBindingValidationException + FullyQualifiedErrorId: ParameterArgumentValidationError, Microsoft.PowerShell.Commands.Remov eJobCommand + PsComputerName: xxx.xx ... '' – joon

+0

К сожалению, я не сделал проверить мой код, прежде чем я его разместил :) Я заметил, что я сделал не так. Поскольку «ScriptBlock» является отдельной областью, мы должны передать идентификатор «Job ID» через параметр «-ArgumentList» в 'Invoke-Command', а затем ссылаться на него через' $ args [0] '. Я обновил код соответствующим образом (после тестирования на этот раз) :) –

+1

Еще раз спасибо за помощь. Я посмотрю, как работает '-ArgumentList'. – joon

1

Любые причины этого не сработают?

Invoke-Command -Session $s -ScriptBlock { 27,29 |% {Remove-Job -Id $_ } } 
+0

Хороший ответ - это зависит от того, откуда идут идентификаторы 'Job'. Если он каким-то образом захочет передать их из локальной системы, ему нужно будет использовать '-ArgumentList', как в моем ответе. –

+0

Вы можете использовать [scriptblock] :: create, если они являются произвольными идентификаторами. Это упростило бы сценарии, если бы задания были названы, когда они были созданы. – mjolinor

+0

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

1

Другой подход заключается в использовании переменного, расширения и Create() метода на ScriptBlock типа.

27, 29 | % { Invoke-Command -Session $s -ScriptBlock $([ScriptBlock]::Create("Remove-Job -Id $_")) }; 

Я не уверен, что это более кратким, чем подход Тревора.

0

Id параметр Remove-Job командлета принимает массив идентификаторов, чтобы вы могли speicfy их так:

Invoke-Command -Session $s -ScriptBlock { Remove-Job -Id 27,29 } 
+0

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

Смежные вопросы