这个问题的版本(“动态变量”或“变量变量”或“在运行时创建变量”)出现了很多,而且几乎在所有情况下它们都不是正确的答案。
不知道解决问题的更好方法的人经常会问这个问题,但有一个更好的方法:集合。数组、列表、哈希表等
问题是:您想读取用户名并将其打印出来。你不能写Hello Alice,因为你不知道他们的名字是什么在你的代码中。这就是变量存在的原因:
$name = Read-Host "Enter your name"
Write-Host "Hello $name"
太好了,你可以在你的源代码中写$name,这永远不会改变。它引用了他们的名字,这确实改变了。不过没关系。
但是你被困住了——如果你只有$name,你怎么会有两个人的名字?你怎么能产生很多变量,比如$name2,$name3? $Alice, $Bob怎么弄?
你可以...
New-Variable -Name (Read-Host "Enter your name") -Value (Read-Host "Enter your name again")
Write-Host "Hello
等待
你在上面放了什么来写他们的名字?您直接回到了变量旨在解决的原始问题。你有一个固定的东西可以放入你的源代码,它允许你使用一个变化的值。
现在你有一个不同的东西,你不能在你的源代码中使用,因为你又不知道它是什么。
一文不值。
修复方法是一个具有固定名称的变量可以引用多个值在一个集合中。
数组 (Get-Help about_Arrays):
$names = @()
do {
$name = Read-Host "Enter your name"
if ($name -ne '')
{
$names += $name
}
} while ($name -ne '')
# $names is now a list, as many items long as it needs to be. And you still
# work with it by one name.
foreach ($name in $names)
{
Write-Host "Hello $name"
}
# or
$names.Count
or
$names | foreach { $_ }
还有更多的收藏,比如
哈希表 (Get-Help about_Hash_Tables):键-> 值对。让我们将文件夹中的每个文件与其大小配对:
$FileSizes = @{} # empty hashtable. (aka Dictionary)
Get-ChildItem *.txt | ForEach {
$FileSizes[$_.BaseName] = $_.Length
}
# It doesn't matter how many files there are, the code is just one block
# $FileSizes now looks like
@{
'readme' = 1024;
'test' = 20;
'WarAndPeace' = 1048576;
}
# You can list them with
$FileSizes.Keys
and
foreach ($file in $FileSizes.Keys)
{
$size = $FileSizes[$file]
Write-Host "$file has size $size"
}
每个文件或每个文件名都不需要动态变量。一个固定名称,一个适用于任意数量值的变量。您需要做的就是“添加多少有多少”和“处理多少有多少”,而无需明确关心有多少。
而且你永远不需要问“现在我已经为我所有的东西创建了变量名......我如何找到它们?”因为您可以在集合中找到这些值,然后将它们放入其中。通过列出所有这些值,从头开始搜索直到找到一个,通过过滤它们,使用 -match 和 -in 和 -contains。
是的,New-Variable 和 Get-Variable 有其用途,如果您了解集合并想使用它们,也许您确实对它们有用。
但我认为 StackOverflow 上的很多人问这个问题仅仅是因为他们还不知道集合。
Dynamic variables in Powershell
Incrementing a Dynamic Variable in Powershell
Dynamic variable and value assignment in powershell
Dynamically use variable in PowerShell
How to create and populate an array in Powershell based on a dynamic variable?
还有更多,在 Python 中也是如此:
https://stackoverflow.com/a/5036775/478656
How can you dynamically create variables via a while loop?