从CSV创建变量

时间:2016-11-08 00:45:09

标签: powershell

我想从CSV中的特定列创建变量。

CSV将包含以下标题:

FolderName,FolderManager,RoleGroup,ManagerEmail

FolderName下将是具有相应文件夹名称的行列表,例如:Accounts,HR,Projects等...(这些名称中的每一个都是FolderName列中的单独行)

所以我想创建一个在稍后阶段调用的变量列表。它们将类似于以下内容:

$Accounts,
$HR,
$Projects,

我根据搜索和google做了一些不同的脚本,但无法产生预期的结果。我希望有人可以带领我朝着正确的方向创建这个脚本。

3 个答案:

答案 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 

等待

你在那里写下他们的名字?你直接回到变量本来要解决的原始问题。您有一个固定的东西放在您的源代码中,这使您可以使用不断变化的值。

现在你有一个不同的东西,你不能在你的源代码中使用,因为你不知道它是什么

它毫无价值。

修复是一个具有固定名称的变量可以引用集合中的多个值

数组 (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和{{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中也是如此:

https://stackoverflow.com/a/5036775/478656

How can you dynamically create variables via a while loop?

答案 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    

`