【问题标题】:Powershell - how to pass csv fields as parametersPowershell - 如何将csv字段作为参数传递
【发布时间】:2015-03-09 13:28:47
【问题描述】:

我有一个问题想要解决,但似乎无法找出关键部分。我们每天使用 .jar 文件处理大量记录,但问题是我们必须逐条处理,这很耗时。我认为如果我们使用 powershell 脚本,我们可以节省大量时间。

问题是我不知道如何将参数从 csv 传递到 powershell 中的函数。

我的 csv 看起来像这样

NAME,ID                                                                                                                                                                   
-------                                                                                                                                                                   
John,18                                                                                                                                                                     
Dave,19                                                                                                                                                    
Carmen,20                                                                                                                                                       
Eric,21                                                                                                                                                                    
Tom,22                                                                                                                                                          
Lisa,23                                                                                                                                                          
Kyle,24

功能是

function CreateUser 
& java -jar --create -user $name -id $id -file D:/HR/$name-$id-form.pdf

我使用

导入了 csv 文件
$dataCSV = "D:\HR\Input\20150303NewUsers.csv"
$data = Import-Csv $dataCSV

所以我需要一些可以系统地进入文件并将 csv 中的名称字段作为 $name 并将 ID 字段作为 $id 一遍又一遍地传递直到完成的东西。但我不知道如何将这两个传递给 ForEach-Object 方法:(

我被困住了……我整个周末都在和这个作斗争,但什么也没有。

任何帮助或指导将不胜感激!或者如果有人知道如何在 python 中做到这一点,那也很酷! :)

【问题讨论】:

标签: python powershell csv


【解决方案1】:

我编写了一个工具,它可以逐步遍历表(从 csv 文件导入)并为表中的每一行生成模板的扩展。我要做的一件事是将行中的每个值复制到与列同名的 powershell 变量中。这可能会对您有所帮助。

这是我写的工具:

<#  This scriptlet is a table driven template tool. 
    It's a refinement of an earlier attempt.

    It generates an output file from a template and
    a driver table.  The template file contains plain
    text and embedded variables.  The driver table has
    one column for each variable, and one row for each
    expansion to be generated.

    2/15/2015

#>

param ($driver, $template, $out);

$OFS = "`r`n"
$list = Import-Csv $driver
[string]$pattern = Get-Content $template
Clear-Content $out -ErrorAction SilentlyContinue

foreach ($item in $list) {
   foreach ($key in $item.psobject.properties) {
      Set-variable -name $key.name -value $key.value
      }
   $ExecutionContext.InvokeCommand.ExpandString($pattern)  >> $out
   }

您可能感兴趣的部分是内部循环,我在其中执行了一个 Set-Variable,将列名与实际值相匹配。

【讨论】:

  • 谢谢沃尔特!这也是个好主意!!
  • 谢谢。我打算添加该工具的示例运行,但我决定这将是题外话。如果有人问,我准备这样做。
  • 很高兴您发表了评论,为您构建了一个真正的答案 +1 stackoverflow.com/help/how-to-answer
【解决方案2】:

不确定是否错字,但您的D:\... 需要用引号引起来,您还没有关闭它。

一旦$data 持有导入值列表,只需执行foreach ($item in $data) {do something}

$item 是您想要的任何单词(变量),它只是指 CSV 中的每一行。

所以...

$data = Import-Csv "D:\importfile.csv"
foreach( $item in $data )
{
    # Do-whatever
}

【讨论】:

  • 是的,对不起,这是一个错字。我仍然面临的问题是如何将名称和 ID 作为变量传递给 foreach
  • 当然,所以它是 $item.ID 其中 $item 是行,ID 是列标题。在您的示例中,您同时拥有 $item.name 和 $item.ID 例如 {New-Aduser -identity $item.name -ID $item.ID}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多