2016-11-08 168 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  

`