我想从CSV中的特定列创建变量。
CSV将包含以下标题:
FolderName,FolderManager,RoleGroup,ManagerEmail
在FolderName
下将是具有相应文件夹名称的行列表,例如:Accounts,HR,Projects
等...(这些名称中的每一个都是FolderName
列中的单独行)
所以我想创建一个在稍后阶段调用的变量列表。它们将类似于以下内容:
$Accounts,
$HR,
$Projects,
我根据搜索和google做了一些不同的脚本,但无法产生预期的结果。我希望有人可以带领我朝着正确的方向创建这个脚本。
答案 0 :(得分:3)
这个问题的版本(“动态变量”或“变量变量”或“在运行时创建变量”)出现了很多,几乎在所有情况下它们都不是正确的答案。
对于那些不知道更好地解决问题的人来说,这通常会被问到,但有更好的方法:收藏。数组,列表,哈希表等
问题在于:您想要读取用户名并将其打印出来。你不能写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
等待
你在那里写下他们的名字?你直接回到变量本来要解决的原始问题。您有一个固定的东西放在您的源代码中,这使您可以使用不断变化的值。
现在你有一个不同的东西,你不能在你的源代码中使用,因为你不知道它是什么。
它毫无价值。
修复是一个具有固定名称的变量可以引用集合中的多个值 。
$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
和{{1来过滤它们}}
是的,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中也是如此:
答案 1 :(得分:0)
基本上,您希望根据从CSV文件获取的值创建文件夹。 (FileName包含诸如FolderName之类的标题, FolderManager, RoleGroup, ManagerEmail)
$File=Import-csv "FileName"
$Path="C:\Sample"
foreach ($item in $File){
$FolderName=$item.FolderName
$NewPath=$Path+"\$FolderName"
if(!(Test-Path $NewPath))
{
New-Item $NewPath -ItemType Directory
}
}
希望这个HElps。
答案 2 :(得分:0)
在PowerShell中,您可以导入CSV文件并获取自定义对象。下面的代码片段显示了如何导入CSV以从中生成对象,然后点引用管道中每个对象的属性来创建新变量(这里是您的特定用例)。
PS>cat .\dummy.csv
"foldername","FolderManager","RoleGroup"
"Accounts","UserA","ManagerA"
"HR","UserB","ManagerB"
PS>$objectsFromCSV = Import-CSV -Path .\dummy.csv
PS>$objectsFromCSV | Foreach-Object -Process {New-Variable -Name $PSItem.FolderName }
PS>Get-Variable -name Accounts
Name Value
---- -----
Accounts
PS>Get-Variable -name HR
Name Value
---- -----
HR
`