我有一个 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
当您使用 时
ForEach-Object
,您需要返回当前对象,以便它通过管道进入下一个 foreach。您可以使用,或者只需在末尾return
输入当前对象变量 ( )。$_
由于您传递的是
$owner
,因此无需将其括在引号中。只需使用变量即可。不要对变量使用单引号,因为单引号会输出你输入的文字字符串。所以字面上地
$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
}