Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Powershell expand variable in scriptblock

I am trying to follow this article to expand a variable in a scriptblock

My code tries this:

$exe = "setup.exe"

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

How to fix the error:

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
like image 447
Glowie Avatar asked Aug 28 '14 14:08

Glowie


2 Answers

You definitely don't need to create a new script block for this scenario, see Bruce's comment at the bottom of the linked article for some good reasons why you shouldn't.

Bruce mentions passing parameters to a script block and that works well in this scenario:

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

In PowerShell V3, there is an even easier way to pass parameters via Invoke-Command:

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

Note that PowerShell runs exe files just fine, there's usually no reason to run cmd first.

like image 176
Jason Shirk Avatar answered Nov 06 '22 15:11

Jason Shirk


To follow the article, you want to make sure to leverage PowerShell's ability to expand variables in a string and then use [ScriptBlock]::Create() which takes a string to create a new ScriptBlock. What you are currently attempting is to generate a ScriptBlock within a ScriptBlock, which isn't going to work. It should look a little more like this:

$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
like image 4
beavel Avatar answered Nov 06 '22 14:11

beavel