【问题标题】:Create variable from CSV从 CSV 创建变量
【发布时间】:2016-11-08 00:45:08
【问题描述】:

我想从 CSV 中的特定列生成变量。

CSV 将具有以下标题:

FolderName,FolderManager,RoleGroup,ManagerEmail

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

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

$Accounts,
$HR,
$Projects,

我已经根据此处和谷歌的搜索完成了一些不同的脚本,但无法产生所需的结果。我希望有人能引导我在正确的方向上创建这个脚本。

【问题讨论】:

  • 请分享您的代码以及您到目前为止所尝试的内容。
  • a list of variables ... 什么?包含什么作为值的变量?如何使用它们?
  • 嘿伙计,感谢您的回复,并帮助解决其他 ps 脚本问题!对于我不清楚和/或解释不正确,我深表歉意!我将尝试回答您的问题以提供更好的理解。 1.我不确定我是否理解这个q,但这不是一个命令,只是一个描述。 2. 它们的值将是 FolderName 列中的文件夹名称。 3. 我想使用这个变量为超过 7 年的文件名的 csv 输出创建一个动态文件名。例如 FI_$VariableHere_Results.csv 这将通过电子邮件发送到 ManagerEmail
  • @TessellatingHeckler : stackoverflow.com/questions/13015303/… 这可能是我发现的最接近我想要实现的目标,除了我想从 csv 获取变量名。这有意义吗?对不起,如果我不是!
  • edit您的问题在 cmets 中包含您的说明

标签: powershell


【解决方案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 { $_ }

还有更多的收藏,比如

哈希表 (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?

【讨论】:

  • 谢谢伙计,我将根据这些信息数组和哈希表进一步研究。感谢您对真正处理这个问题的诚实和有见地的反馈。我也很欣赏你用来表达观点的例子和语言,它们非常有帮助!非常感谢!
【解决方案2】:

基本上,您希望根据从 CSV 文件中获得的值创建文件夹。 (FileName 有诸如 FolderName 之类的标题, 文件夹管理器, 角色组, 经理邮箱)

$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
}
}

希望这能有所帮助。

【讨论】:

  • 嘿伙计,感谢您在这里的帮助,但不,我不想创建文件夹,因为它们已经存在。我理解我的措辞和提问方式很可能是这里的问题,而不是你的答案。不过,感谢您的宝贵时间!
【解决方案3】:

在 PowerShell 中,您可以导入 CSV 文件并取回自定义对象。下面的代码 sn-p 显示了如何导入 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    

`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2014-04-15
    • 2019-02-07
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多