PowerShell 中的变量

在我们的迷你系列“Shell 中的变量”中,学习如何在 PowerShell 中处理局部变量。
150 位读者喜欢这篇文章。
Shells in a competition

Opensource.com

在计算机科学(以及日常计算)中,变量是内存中的一个位置,用于保存任意信息以供稍后使用。换句话说,它是一个临时的存储容器,供您将数据放入和取出。在 Bash shell 中,数据可以是单词(计算机术语中的字符串)或数字(整数)。

您可能以前从未(有意识地)在计算机上使用过变量,但您可能在生活的其他领域使用过变量。当您说“给我那个”或“看看这个”之类的话时,您正在使用语法变量(您将它们视为代词)。“这个”和“那个”的含义取决于您脑海中想象的任何事物,或者您指向的任何事物作为指示器,让您的听众知道您指的是什么。当您进行数学运算时,您使用变量来代表未知值,即使您可能不称它们为变量。

本文讨论了 PowerShell 中的变量,它在 Windows、Linux 或 Mac 上运行。开源 Bash shell 的用户应参考我关于 Bash shell 中变量的文章(尽管您可以在 Linux 上运行 PowerShell,并且它是开源的,因此您仍然可以继续阅读本文)。

注意: 本文中的示例来自在开源操作系统 Linux 上运行的 PowerShell 会话,因此如果您使用的是 Windows 或 Mac,则文件路径会有所不同。但是,Windows 会自动将 / 转换为 \ ,并且所有示例都适用于所有平台,前提是您替换明显的差异(例如,您的用户名不太可能是 seth)。

变量有什么用?

您是否需要在 PowerShell 中使用变量取决于您在终端中执行的操作。对于某些用户来说,变量是管理数据的重要手段,而对于另一些用户来说,它们是次要的和临时的便利,或者对于某些人来说,它们可能根本不存在。

最终,变量是一种工具。当您发现它们的用途时可以使用它们,或者让它们保持原样,因为您知道它们由您的操作系统管理。然而,知识就是力量,理解变量在 Bash 中的工作方式可以引导您进行各种意想不到的创造性问题解决。

设置变量

您不需要特殊权限即可创建变量。它们可以自由创建,自由使用,并且通常是无害的。在 PowerShell 中,您可以通过定义变量名,然后使用 Set-Variable 命令设置其值来创建变量。下面的示例创建一个名为 FOO 的新变量,并将其值设置为字符串 $HOME/Documents

PS> Set-Variable -Name FOO -Value "$HOME/Documents"

成功是出奇的沉默,因此您可能不确定您的变量是否已设置。您可以使用 Get-Variable (简称 gv) 命令自行查看结果。为了确保变量完全按照您的定义读取,您也可以将其用引号括起来。这样做会保留变量中可能出现的任何特殊字符;在本例中,这不适用,但这仍然是一个好习惯

PS> Get-Variable "FOO" -valueOnly
/home/seth/Documents

请注意,FOO 的内容与您设置的内容并不完全相同。您为变量设置的文字字符串是 $HOME/Documents,但现在它显示为 /home/seth/Documents。发生这种情况是因为您可以嵌套变量。$HOME 变量指向当前用户的主目录,无论它在 Windows 上是 C:\Users,在 Linux 上是 /home,还是在 Mac 上是 /Users。由于 $HOME 嵌入在 FOO 中,因此当调用该变量时,该变量会被展开。以这种方式使用默认变量可以帮助您编写可在跨平台操作的可移植脚本。

变量通常旨在将信息从一个系统传递到另一个系统。在这个简单的示例中,您的变量不是很有用,但它仍然可以传达信息。例如,由于 FOO 变量的内容是文件路径,因此您可以使用 FOO 作为其值引用的目录的快捷方式。

要引用变量 FOO内容而不是变量本身,请在变量前加上美元符号 ($)

PS> pwd
/home/seth
PS> cd "$FOO"
PS> pwd
/home/seth/Documents

清除变量

您可以使用 Remove-Variable 命令删除变量

PS> Remove-Variable -Name "FOO"
PS> gv "FOO"
gv : Cannot find a variable with the name 'FOO'.
[...]

在实践中,通常没有必要删除变量。变量相对“廉价”,因此您可以在不需要它们时创建它们并忘记它们。但是,有时您可能希望确保变量为空,以避免将不必要的信息传递给可能读取该变量的另一个进程。

创建具有冲突保护的新变量

有时,您可能有理由相信变量已被您或其他进程设置。如果您不想覆盖它,您可以使用 New-Variable,如果同名变量已存在,则该命令旨在失败,或者您可以先使用条件语句检查变量

PS> New-Variable -Name FOO -Value "example"
New-Variable : A variable with name 'FOO' already exists.

注意: 在这些示例中,假设 FOO 设置为 /home/seth/Documents

或者,您可以构造一个简单的 if 语句来检查现有变量

PS> if ( $FOO ) 
>> { gv FOO } else 
>> { Set-Variable -Name "FOO" -Value "quux" } 

添加到变量

您可以添加到现有变量,而不是覆盖变量。在 PowerShell 中,变量具有多种类型,包括字符串、整数和数组。当选择创建基本上具有多个值的变量时,您必须决定是否需要字符分隔字符串数组。您可能不在乎其中一种方式,但接收变量数据的应用程序可能会期望其中一种方式,因此请根据您的目标做出选择。

要将数据附加到字符串变量,请使用 += 语法

PS> gv FOO
foo
PS> $FOO += ",bar" 
PS> gv FOO
foo,bar
PS> $FOO.getType().Name
String

数组是 PowerShell 中的特殊变量类型,需要 ArrayList 对象。这超出了本文的范围,因为它需要深入研究 PowerShell 的 .NET 内部结构。

使用环境变量走向全局

到目前为止,本文中创建的变量都是局部变量,这意味着它们仅适用于您在其中创建它们的 PowerShell 会话。要创建其他进程可以访问的变量,您可以创建环境变量,这将在以后的文章中介绍。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,通常同时进行。

6 条评论

或者只是这样设置它。
$whatevername = "随机字符串"

很棒的技巧,谢谢!我觉得这种简写方式破坏了 PowerShell 中其他变量命令的一致性,我不想让它混淆概念的介绍,但这正是评论的用途:专业技巧!

回复 作者 Xiakit (未验证)

+1 赞成使用

```
$foo = "foo"
```

这是将内容存储在变量中的惯用方式。当您需要更动态的东西时,变量 cmdlet 非常有用! ?

另外,我认为您有一个错字... 要附加到字符串变量,应该是 `+=` 而不是 `=+`。这与许多类似 C 的语言一致。

感谢您发现 += 的错误。文章已更正。

回复 作者 Tyler Leonhardt (未验证)

我不使用 Powershell,但看到它可以在 Linux 上运行很有趣,我会尝试一下。至少一个下午!

非常好的帖子。感谢提供信息。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.