2016-11-29 90 views
0
function UpdateCSV 
{ 
param(
     [Parameter(Mandatory=$true)]$path, 
     [Parameter(Mandatory=$true)]$Row, 
     [Parameter(Mandatory=$true)]$exportpath, 
     [Parameter(Mandatory=$true)]$Delimiter 
    ) 
try{$csv = import-csv "$path" -Delimiter $Delimiter | Select-Object *,@{ Name= 'Department' ; Expression= {'Unkown'} }, 
                     @{ Name='Office' ; Expression= {'Unkown'} }, 
                     @{ Name= 'ADStatus' ; Expression= {'Unkown'} } 
    } 
catch{break} 


$result = foreach($user in $csv){ 
    $userrow = $user.$row 
    write-host "$userrow" 
    $Username = $userrow.trim() 
    $ADUser = get-aduser -Filter {name -like $Username -or CN -like $Username -or sAMAccountType -like $Username} -Properties * -ErrorAction SilentlyContinue 

if(!$ADUser){ 
    $user.Department = "No ADUser" 
    $user.Office = "No ADUser" 
    $user.ADStatus = "No ADUser" 
    } 


else{ 
    $user.$row = $Username 
     if($ADUser.department -gt $null){$user.Department = $ADUser.department} 
     else{$user.Department = "Empty"} 
     if($ADUser.office -gt $null){$user.office = $ADUser.office} 
     else{$user.Office = "Empty"} 
    $user.ADStatus = $ADUser.enabled 

} 
$user 

} 
$result | export-csv "$exportpath" -Delimiter ";" -ErrorAction Stop 

} 

我所试图做的是让一个参数引用在那里我的用户名的行的名字,但是当我的用户"$user.$row"它不工作,在write-host部分写入了整列,而不只是行我$row如何使用一个变量来调用行的名称在导入的CSV

指定但是,如果我不是硬编码$userrow = "$user.example"它直接与在write-host部分只写出来的那个值,而不是所有的列

所以问题是我如何调用一个行,我有一个变量的名称。

这是第一次写东西会被别人比我可以使用,所以请别指出,如果有一些明显的misstakes

回答

1

我想你要找的是$ _。columnheading

当您import-csv并对其进行管道操作时,列标题就是该值的名称。 如果您将每一行想象为对象,并将每一列标题想象为对象的值。当你import-csv时,每个对象都被单独传送。

$ _是已通过管道传输的当前对象。因此:

$_.department or $_.name etc. will have the value you are looking for. 

我希望这是有道理的,并回答你的问题。

谢谢,Tim。

更新之后备注

try{$csv = import-csv "$path" -Delimiter $Delimiter | Select-Object *,@{ Name= 'Department' ; Expression= {'Unkown'} }, 
                    @{ Name='Office' ; Expression= {'Unkown'} }, 
                    @{ Name= 'ADStatus' ; Expression= {'Unkown'} } 
                    @{ Name= 'User' ; Expression= {$_.columnheadingforusercolumn} 
} 


$result = foreach($user in $csv){ 
    $userrow = $user.user 
    write-host "$userrow" 
} 
+0

不知道我遵循此处,在try块代码正在按excpted。 我很努力在foreach循环中调用$ user。$ row。这是因为我无法预测$行的名称,因为它会与我们审计的每个系统不同 – Jakodns

+0

在您的try块中,可以使用需要匹配名称的表达式。如果您添加名称='用户';表达式= {$ _。columnnameforuser}到你的散列表,你的用户标题将永远是相同的。 当您的CSV更改时,您需要更新哈希表及其表达式以收集正确的数据。之后的一切应该能够保持不变。例如$ userrow = $ user.user等 –

+0

我添加的列正在作为例外,我可以作为例外调用它们。这是我要求用户在我无法调用的$ row变量中命名的列。 我添加的三行我没有任何问题,我有一个问题的行是已经在CSV中,因为我不知道名称,因此我需要用户$ user。$ row 。如果我误解了你,你能否展示一下它的工作原理? – Jakodns

相关问题