2016-11-08 102 views
0

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

CSV将具有以下标题:

FolderName,FolderManager,RoleGroup,ManagerEmail 

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

所以我想创建的变量列表在稍后阶段呼吁。他们会像下面这样:

$Accounts, 
$HR, 
$Projects, 

我已经做了基于搜索这里和谷歌的几个不同的脚本,但无法产生预期的效果。我希望有人能带领我在这里正确的方向来创建这个脚本。这个问题的

+0

请分享您的代码,到目前为止,你已经尝试过的东西。 – Nasir

+1

'变量列表...一个什么?包含什么作为值的变量?如何使用它们? – TessellatingHeckler

+0

嘿,队友,感谢您的回复,并帮助其他PS脚本问题! 我很抱歉,我不清楚,和/或不正确解释!我会尽量回答你的问题以提供更好的理解。 1.我不确定我是否理解这个q,但这不是一个命令只是一个描述。 2.它们的值将是FolderName列中文件夹的名称。 3.我想使用此变量为csv输出创建7年以上文件名的动态文件名。例如FI_ $ VariableHere_Results.csv 然后通过电子邮件发送给ManagerEmail – danielbostock

回答

1

版本(“动态变量”或“变量变量”或“在运行时创建变量”)来了很多,并且在几乎所有情况下,它们是不正确的答案。

这通常是由人谁不知道一个更好的方式来处理他们的问题问,但有一个更好的办法:集合。数组,列表,哈希表等

这里的问题:你想读一个用户名,并打印出来。你不能写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 { $_ } 

而更多的藏品,像

Hashtable中(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进行筛选。


是的,新的变量和获取变量有它们的用处,如果你了解馆藏和想使用它们,也许你对他们的用途。

但我认为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

感谢队友,我打算进一步研究基于这个信息数组和哈希表。我很感谢你的真诚和有见地的反馈,真正处理这个问题。我也很欣赏你用来表达你的观点的例子和语言,他们非常有帮助!非常感谢! – danielbostock

0

基本上你想创建一个基于你从CSV文件中获取价值的文件夹。 (文件名具有标题诸如文件夹名称, 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 
} 
} 

希望这有助于。

+0

嘿伙计, 感谢您的帮助,但没有我不想创建文件夹,因为他们已经存在。我理解我的措辞和提问的方式很可能是这里的问题,而不是你的答案。但是感谢您的时间! – danielbostock

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  

`