2014-08-28 2 views
2

Я пытаюсь следовать this article расширить переменную в ScriptBlockPowershell расширить переменную в ScriptBlock

Мой код пытается это:

$exe = "setup.exe" 

invoke-command -ComputerName $j -Credential $credentials -ScriptBlock {cmd /c 'C:\share\[scriptblock]::Create($exe)'} 

Как исправить ошибку:

The filename, directory name, or volume label syntax is incorrect. 
    + CategoryInfo   : NotSpecified: (The filename, d...x is incorrect.:String) [], RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 
    + PSComputerName  : remote_computer 

ответ

2

Чтобы следить за статьей, вы хотите, чтобы использовать возможности PowerShell для расширения переменных в строке, а затем использовать [ScriptBlock]::Create(), которая берет строку для создания ew ScriptBlock. В настоящее время вы пытаетесь создать ScriptBlock в ScriptBlock, который не будет работать. Это должно выглядеть немного больше, как это:

$exe = 'setup.exe' 
# The below line should expand the variable as needed 
[String]$cmd = "cmd /c 'C:\share\$exe'" 
# The below line creates the script block to pass in Invoke-Command 
[ScriptBlock]$sb = [ScriptBlock]::Create($cmd) 
Invoke-Command -ComputerName $j -Credential $credentials -ScriptBlock $sb 
4

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

Брюс упоминает передачи параметров в блок скрипта и который хорошо работает в этом сценарии:

$exe = 'setup.exe' 
invoke-command -ComputerName $j -Credential $credentials -ScriptBlock { param($exe) & "C:\share\$exe" } -ArgumentList $exe 

В PowerShell V3, есть еще более простой способ передать параметры через Invoke-Command:

$exe = 'setup.exe' 
invoke-command -ComputerName $j -Credential $credentials -ScriptBlock { & "C:\share\$using:exe" } 

Обратите внимание, что PowerShell запускает exe-файлы просто отлично, обычно нет причин запускать cmd.

+0

У меня отсутствует связанная статья? – aggieNick02

+1

См. Ссылку в вопросе, а не в ответе. –

+0

А, спасибо. Суть заключается в том, чтобы не делать [scriptblock] :: create, потому что если вы испортили цитату, вы можете создать/запустить код, который вы не имеете в виду. Использование, которое вы описываете, выглядит великолепно и означает, что «eval», как и все, происходит, поэтому я обязательно попробую именно так. – aggieNick02

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