如何将引用的参数传递给PowerShell Invoke-Command和ScripBlocks?

Jas*_*son 4 powershell

我需要在远程计算机上运行ps1脚本.该脚本将传递一个表示文件名的参数.我已经尝试了很多很多不同的组合和方法来将参数传递给脚本块,但是在尝试支持脚本名称和/或文件名中的空格时,我总是遇到一个或另一个错误.

注意:最终结果将使用Invoke-Command参数在REMOTE计算机上运行脚本,但为了简单起见,测试所有示例都在本地运行.-ComputerName

给出样本"远程"脚本

#processFile.ps1
$args[0]     # Just outputs the first parameter passed
Run Code Online (Sandbox Code Playgroud)

当名称中没有空格时,以下工作

$cmd = ".\processFile.ps1"
$fn = "someFile.csv"
$sb = [ScriptBlock]::Create("$cmd $fn")
Invoke-Command -ScriptBlock $sb

# Outputs the correct
someFile.csv
Run Code Online (Sandbox Code Playgroud)

但是,以下不起作用

$cmd = ".\processFile.ps1"
$fn = "some File.csv"
$sb = [ScriptBlock]::Create("$cmd $fn")
Invoke-Command -ScriptBlock $sb

# Outputs the incorrect
some
Run Code Online (Sandbox Code Playgroud)

显然,文件名参数需要进行转义并作为"some File.csv"传递.这可以通过以下方式完成:

$cmd = ".\processFile.ps1"
$fn = "some File.csv"
$sb = [ScriptBlock]::Create("$cmd `"$fn`"")   # Notice the escape $fn parameter
Invoke-Command -ScriptBlock $sb

# Outputs the correct
some File.csv
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将此空间支持扩展到脚本名称时,一切都崩溃了.以下失败

$cmd = ".\processFile.ps1"
$fn = "some File.csv"
$sb = [ScriptBlock]::Create("`"$cmd`" `"$fn`"") # Notice the attempt to escape both parameters
Run Code Online (Sandbox Code Playgroud)

有以下例外

Exception calling "Create" with "1" argument(s): "Unexpected token 'some File.csv' in expression or statement."
Run Code Online (Sandbox Code Playgroud)

我尝试过的所有东西,以及许多不同的方法,都产生了类似的东西.我似乎无法让两个参数都被转义.(实际上,问题不仅仅是我无法逃避第一个参数.我的一些尝试包括嵌套引号,单引号,[ScriptBlock] :: Create,{},$ executionContext等.

mjo*_*nor 6

试试这个:

$sb = [ScriptBlock]::Create(@"
&'$cmd' '$fn'
"@)
Run Code Online (Sandbox Code Playgroud)