Powershell pass command switches as variable

时间:2019-03-06 11:44:25

标签: powershell

i'm trying to create a script that handle copy of folders and files. i need to pass the switches '-recures -container' if it's a folder and nothing is it's a file. is there a way to create a variable that will hold the '-recurse -container' and pass it to the command like this:

$copy_args = '-Recurse -container '
Copy-Item $tmptmp\$file -Destination \\$server\d$\$tmpprd\ $copy_args -Force

thanks Mor

2 个答案:

答案 0 :(得分:6)

做到这一点的最佳方法是使用一种称为splatting的技术。创建要传递的参数的哈希表,然后将@与变量名(而不是$)一起使用,以表明您希望将其插入所需的cmdlet参数:

$copy_args = @{
     Recurse = $true
     Container = $true
}

Copy-Item $tmptmp\$file -Destination \\$server\d$\$tmpprd\ @copy_args -Force

答案 1 :(得分:1)

Mark Wragg's helpful answer建议 电镀 ,它为您提供了最灵活的

顺便说一句:

  • 设置-Recurse就足够了,因为它暗含 -Container
  • 实际上,您甚至可以无条件使用-Recurse ,因为如果源路径是 file ,则可以忽略

有时候,您可能想直接 有条件地传递一个开关,而不会增加内容冗长。

鉴于语法--SomeSwitch:$boolVar-SomeSwitch:(<boolExpression>)(可选地:之后有空格)-不明显,让我演示一下:

使用布尔值变量

# The source path.
$sourcePath = $tmptmp\$file

# Set the Boolean value that will turn the -Recurse switch on / off.
$doRecurse = Test-Path -PathType Container $sourcePath # $true if $sourcePath is a dir.

# Use -Recurse:$doRecurse
Copy-Item -Recurse:$doRecurse $sourcePath -Destination \\$server\d$\$tmpprd\ -Force

或者,使用布尔 expression

Copy-Item -Recurse:(Test-Path -PathType Container $sourcePath) $sourcePath -Destination \\$server\d$\$tmpprd\ -Force

请注意,在使用 switch 参数的情况下,必须使用:来将参数名称与参数分开,以表明该参数适用于 switch (通常接受参数),而不是单独的位置参数。

注意事项:在这种情况下以及通过将有效的$false传递给开关都在技术上 省略相同开关,在某些情况下差异很重要
继续阅读以了解更多信息。


从技术上讲,cmdlet或高级功能可以通过自动$false变量来区分省略开关和带有$PSBoundParameters 参数的开关,其中包含所有显式传递的参数的字典。

对于常见的-Confirm参数,此区别是有意使用的 -非典型

这是一个简单的演示:

# Sample advanced function that supports -Confirm with a medium impact level.
function foo { 
  [CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')]
  param() 

  if ($PSCmdlet.ShouldProcess('dummy')) { 'do it' }  
}

# Invocation *with -Confirm* prompts unconditionally.
foo -Confirm  # ditto with -Confirm:$true

# Invocation *without -Confirm*:
# Whether you'll be prompted depends on the value of the $ConfirmPreference
# variable: If the value is 'Medium' or 'Low', you'll be prompted.
foo

# Invocation with *-Confirm:$false* NEVER prompts,
# irrespective of the $ConfirmPreference value.
foo -Confirm:$false