2015-01-16 6 views
3

У меня есть рабочий сценарий Powershell, и я бы хотел, чтобы скрипт-блок был втянут из внешнего файла.Импорт скриптового блока из файла

Рабочая:

$scriptblock = { ... } 
invoke-command -ComputerName $server -ScriptBlock $Scriptblock -ArgumentList $server,$team -Credential $credential -asjob -JobName Dashboard_$server -SessionOption (New-PSSessionOption -NoMachineProfile) 

Выход "Get-Job -id | приемо-работу" отлично

Не работает:

# Generate scriptblock from file 
$file = Get-Content E:\Dashboard\Windows\winrm_scriptblock.txt 
$Scriptblock = $executioncontext.invokecommand.NewScriptBlock($file) 

invoke-command -ComputerName $server -ScriptBlock $Scriptblock -ArgumentList $server,$team -Credential $credential -asjob -JobName Dashboard_$server -SessionOption (New-PSSessionOption -NoMachineProfile) 

Вывод «получить -job -id | get-job "пусто

Содержимое winrm_scriptblock.txt - это именно то, что включено между фигурными скобками в переменной scriptblock, определенной в рабочей версии.

Любая помощь приветствуется.

+0

ли эта работа для вас? '$ Scriptblock = [scriptblock] :: Create ((Get-Content E: \ Dashboard \ Windows \ winrm_scriptblock.txt))' – Matt

ответ

1

Любая причина не просто использовать параметр -FilePath Invoke-Command?

+0

Да, это работает после того, как я изменил .txt на .ps1 ....thanks – kernelpanic

1

Очень связано с ответом от How do I pass a scriptblock as one of the parameters in start-job

Если вы сохранили строку "Get-ChildItem C: \ Temp" в файле "E: \ Панель управления \ Windows \ winrm_scriptblock.txt", то это должно код выхода содержимое папки «C: \ temp» на вашем локальном компьютере.

Invoke-Command -ScriptBlock ([scriptblock]::Create((Get-Content "E:\Dashboard\Windows\winrm_scriptblock.txt"))) 

Параметры

Что касается проходных параметров идет Pass arguments to a scriptblock in powershell крышки, которые отвечают также. Как Keith Hill состояний: ScriptBlock только анонимная функция

Рассмотрим следующие содержимое файла

param(
    $number 
) 

$number..2 | ForEach-Object{ 
    Write-Host "$_ lines of code in the file." 
} 

И команда

Invoke-Command -ScriptBlock ([scriptblock]::Create((Get-Content "E:\Dashboard\Windows\winrm_scriptblock.txt"))) -ArgumentList "99" 

даст вам раздражает выход

99 lines of code in the file. 
98 lines of code in the file. 
97 lines of code in the file. 
.... 
+0

Пробовал это, и он не работает для меня. Мой скриптовый блок длиной около 350 строк и принимает параметры. Не уверен, если это имеет значение. – kernelpanic

+0

Я попытаюсь передать его параметры и посмотреть, работает ли это. Сама длина не должна иметь значения – Matt

+0

@kernelpanic. Обновленный ответ должен охватывать эту базу. – Matt

5

Я знаю, что у вас уже есть ответы, но другой способ получить ScriptBlock из файла сценария заключается в использовании get-command командлета:

$sb=get-command C:\temp\add-numbers.ps1 | select -ExpandProperty ScriptBlock 

$ С.Б. является теперь ScriptBlock для сценария.

+0

Это работало для загрузки автономного ps1, содержащего CmdletBindings, в то время как вышеприведенные ответы не удались. –

-2

вы должны извлечь {} из E: \ Панель управления \ Windows \ winrm_scriptblock.txt