6

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
1
  • Here's the referenced article on the WaybackMachine as Microsoft have moved/deleted the original. Commented May 11, 2023 at 15:15

2 Answers 2

5

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.

Sign up to request clarification or add additional context in comments.

3 Comments

Am I missing the linked article?
See the link in the question, not in the answer.
Ah, thanks. The gist is avoid doing [scriptblock]::create because if you screw up the quoting, you can create/run code you don't mean to. The using you describe looks great and means no 'eval' like stuff going on, so I'll definitely try that way first.
4

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.