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 = "Random string"

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

回复 ,作者:Xiakit (未验证)

+1 赞成使用

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

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

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

感谢您指出 += 的错误。文章已更正。

回复 ,作者:Tyler Leonhardt (未验证)

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

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

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.