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
答案 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