Powershell 从 CSV 设置变量读取

Powershell 从 CSV 设置变量读取

我有一个 csv 文件,其中有两列“路径”和“所有者”。

我已经创建了下面的脚本,它可以从 CSV 文件中读取,但是当我尝试从 csv 分配变量时它失败了。

Import-Csv C:\test\output.csv | ForEach-Object {
    $Path = $_.path
    $owner = $_.owner
    "The username is $Path and the owner is $owner"
}
ForEach-Object {
    $Path = $_.path
    $owner = $_.owner

    $Account = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList '$owner'
    $Acl = Get-Acl -Path $Path
    $Acl.SetOwner($Account)

    Set-Acl -Path $owner -AclObject $Acl
}

从第一段来看输出是正确的,显示了路径和所有者,但第二部分没有根据路径设置所有者。

答案1

第二个 foreach 没有要迭代的输入对象。因此

  • 导入到变量中,并将其两次导入到 foreach 循环中
  • 导入两次

$csv = import-csv c:\test\output.csv 
$csv | foreach-object {
  $Path = $_.path
  $owner =$_.owner
  "The username is $Path and the owner is $owner"
}
$csv | ForEach-Object {
    $Path = $_.path
    $owner =$_.owner
    $Account = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList "$owner"
    $Acl = Get-Acl -Path $path
    $Acl.SetOwner($Account);
    Set-Acl -Path $Path -AclObject $Acl
}

答案2

  1. 当您使用 时ForEach-Object,您需要返回当前对象,以便它通过管道进入下一个 foreach。您可以使用,或者只需在末尾return输入当前对象变量 ( )。$_

  2. 由于您传递的是$owner,因此无需将其括在引号中。只需使用变量即可。

  3. 不要对变量使用单引号,因为单引号会输出你输入的文字字符串。所以字面上地 $owner而不是$owner变量的值。

代码:

Import-Csv C:\test\output.csv | ForEach-Object {
    $Path = $_.path
    $owner = $_.owner
    "The username is $Path and the owner is $owner"
    return $_ # Returning current object
}
ForEach-Object {
    $Path = $_.path
    $owner = $_.owner

    $Account = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList $owner # No quotations
    $Acl = Get-Acl -Path $Path
    $Acl.SetOwner($Account)

    Set-Acl -Path $owner -AclObject $Acl
}

另外,您不需要 2 个 foreach 循环。为什么不直接将它们连接起来呢?您可以使用它们Write-Host来输出所需的字符串。

Import-Csv C:\test\output.csv | ForEach-Object {
    $Path = $_.path
    $owner = $_.owner
    Write-Host "The username is $Path and the owner is $owner"

    $Account = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList $owner
    $Acl = Get-Acl -Path $Path
    $Acl.SetOwner($Account)

    Set-Acl -Path $owner -AclObject $Acl
}

相关内容