当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell Splatting:它是什么以及它如何工作?

作者:精品下载站 日期:2024-12-14 13:03:27 浏览:14 分类:玩电脑

PowerShell Splatting:它是什么以及它如何工作?


PowerShell splatting 可能听起来很奇怪,但这种技术提供了一种格式化参数并将参数发送到 cmdlet 和函数的便捷方法。您可以利用展开来使代码更具可读性和更易于使用,而不是一长串参数或由容易出错的反引号分隔的相同参数。

在本文中,您将了解如何最好地使用 PowerShell splatting 来增强您的脚本和代码!

先决条件

如果您想按照本文进行操作,请确保您拥有用于大多数常见功能的 Windows PowerShell 5.1,但拥有能够覆盖展开参数的 PowerShell 7.1(下面的演示)。

什么是 PowerShell 泼溅?

要了解 PowerShell splatting,您必须首先了解基本参数。通常,当您在 PowerShell 中将参数传递给命令时,您会使用破折号、参数名称后跟参数,如下所示。

Copy-Item -Path "TestFile.txt" -Destination "CopiedFile.txt" -WhatIf -Force

或者,您也可以使用反引号传递参数。

Copy-Item `
	-Path "TestFile.txt" `
	-Destination "CopiedFile.txt" `
	-WhatIf `
	-Force

为什么要使用传统方法或反引号方法?传统方法很好,但是参数很多,处理和读取往往变得很麻烦。使用反引号“`,似乎可以提供更好的可读性。由于很容易忘记或放错反引号,因此通常不推荐使用此技术。

相反,您可以使用 PowerShell splatting。要展开参数集,首先创建一个包含每个参数和参数参数的键/值对的哈希表。然后,构建哈希表后,使用 @ 将这组参数传递给命令。

例如,您可以创建一个名为 $Params 的哈希表,然后将哈希表中定义的一组参数传递给 Copy-Item cmdlet,如下所示。

$Params = @{
  "Path"        = "TestFile.txt"
  "Destination" = "CopiedFile.txt"
  "WhatIf"      = $True
  "Force"       = $True
}

Copy-Item @Params

结合传统参数和泼溅

当您测试脚本或在命令行上时,您可以轻松组合这两种方法。对于脚本,通常最好最终创建一个 splatted 变量来分配给函数或 cmdlet。下面是一个示例:

$Params = @{
  "Path"        = "TestFile.txt"
  "Destination" = "CopiedFile.txt"
}

Copy-Item @Params -Force -WhatIf

正如您所知,这是一种非常有用的技术,您不必根据需要放弃任何一种方法。有时,您可能想要测试附加参数或通过组合方法对参数进行不同的格式化。

覆盖 Splatted 参数

在 PowerShell 7.1 中,您现在可以覆盖展开参数。在此之前,您无法通过传递的参数修改splatted 参数。作为覆盖 splatted 参数的示例,请注意下面如何覆盖 -WhatIf 参数。

$Params = @{
  "Path"        = "TestFile.txt"
  "Destination" = "CopiedFile.txt"
  "WhatIf"      = $True
  "Force"       = $True
}

Copy-Item @Params -WhatIf:$False

[玩转系统] PowerShell Splatting:它是什么以及它如何工作?

覆盖 splatted 参数允许您否定哈希表中定义的键/值参数,而是使用传统定义的参数值。

位置参数的喷射数组

使用命名参数被认为是最佳实践,这会强制您指定参数名称,后跟参数参数。不过,您也可以按位置来展开参数。

例如,如果您想将名为 TestFile.txt 的文件复制到名为 CopiedFile.txt 的文件,则可以使用如下位置参数来执行此操作。

Copy-Item 'TestFile.txt' 'CopiedFile.txt'

您还可以创建一个仅包含参数值的数组(而不是如上所示的哈希表),而不是用老式的方式指定位置参数。下面您将看到一个例子。

$ParamArray = @(
  "TestFile.txt"
  "CopiedFile.txt"
)

Copy-Item @ParamArray

[玩转系统] PowerShell Splatting:它是什么以及它如何工作?

尽管这种技术并不经常使用,但这可能很有用,因为它是一种提供展开参数的不太冗长的方法。请记住,您需要确保知道给定函数或 cmdlet 中参数的位置;否则,您将面临将值传递给错误目标参数的风险。

代理函数和 Splatted 命令

有时,PowerShell cmdlet 并不能完全满足您的需要。在这种情况下,您可以选择创建“包装”函数,甚至代理函数。这些函数允许您向原始 cmdlet 添加其他参数,然后使用新参数调用该 cmdlet。

了解 $Args$PSBoundParameters

当您在 PowerShell 中运行函数时,PowerShell 会创建一个名为 $Args 的自动数组变量。该数组包含传递给该函数的所有未命名参数值。

您会发现另一个名为 $PSBoundParameters 的自动变量,其中包含所有绑定参数的哈希表。请注意下面的 Test-Function 函数返回 $Param1$Param2 参数。

Function Test-Function {
  Param(
    $Param1,
    $Param2
  
    )
  Write-Host "Unnamed Parameters" -ForegroundColor 'Green'
  $Args

  Write-Host "Bound Parameters" -ForegroundColor 'Green'
  $PSBoundParameters
}

Test-Function "test1" "test2" "test3" -Param1 "testParam" -Param2 "testParam2"

[玩转系统] PowerShell Splatting:它是什么以及它如何工作?

这些自动变量与splatting有何关系?当您构建代理命令时,自动传递绑定和未绑定参数非常有用。

使用 Splatted 参数构建包装函数

要展示展开在包装函数中的作用,请创建一个自定义函数,将未命名参数和命名参数传递给 Copy-Item cmdlet。通过这种技术,您可以快速创建自定义函数,添加附加功能,但保留您期望的相同参数集。

Function Copy-CustomItem {
  Get-ChildItem

  Copy-Item @Args @PSBoundParameters

  Get-ChildItem
}

[玩转系统] PowerShell Splatting:它是什么以及它如何工作?

请务必记住,如果您使用 CmdletBinding 声明或定义参数属性,则自动变量 $Args 将不再可用。

结论

将参数分配给函数和 cmdlet 对于代码可读性和功能性来说是一种非常有用的技术。由于操作哈希表和数组很容易,因此您可以快速扩展展开值,以根据传递的选项有条件地修改值。立即将这种强大的技术融入您的脚本中!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯