2017-01-10 47 views
0

我有一个名为script1.ps1的PowerShell脚本,可以很好地工作。下面是该脚本:自动搜索本地“管理员”组的成员

Write-Host Script to display members of the local -ForegroundColor Green 
Write-Host Administators group of a remote server. -ForegroundColor Green 
Write-Host "`n" 

$strComputer = Read-Host "Please enter the computer name" 

$computer = [ADSI]("WinNT://" + $strComputer + ",computer") 
$group = $computer.PSBase.Children.Find("administrators") 

Write-Host "" 
Write-Host "Computer Name : "$computer.Name 
Write-Host "_____________________________________" 
Write-Host "" 
Write-Host "Group Name : "$Group.Name 
Write-Host "_____________________________________" 

$domain = $group.Path.Split("/")[2] 
$string1 = "WinNT://" + $domain + "/" + $strComputer + "/" 
$string2 = $strComputer + "/" 
$string3 = "WinNT://" 

$members = ($group.PSBase.Invoke("Members") | Foreach-Object {$_.GetType().InvokeMember("Adspath", 'GetProperty', $null, $_, $null)}) -replace ($string1,$string2) -replace ($string3,"") 

Write-Host "" 
Write-Host "Members : " 
Write-Host "" 
$members 

但正如你所看到的,我不得不计算机的名称我想每次都写。 我问自己,是否有一个功能或其他东西自动从文本或CSV文件中的计算机名称? 像这样在脚本开始时,它会自动将所有计算机名称&给我本地“管理员”组的成员,然后将其导出到一个文本文件或CSV文件中?


编辑:根据给出的答案更新脚本。

我有一个名为script1.ps1的PowerShell脚本不能很好地工作。下面是该脚本:

Write-Host Script to display members of the local -ForegroundColor Green 
Write-Host Administators group of a remote server. -ForegroundColor Green 
Write-Host "`n" 

Get-Content 'C:\Users\herbautr\Desktop\List1.txt' | ForEach-Object { 
    Write-Host "-$_-" 
    $computer = [ADSI]("WinNT://" + $_ + ",computer") 
    $group = $computer.PSBase.Children.Find("administrators") 

    Write-Host "" 
    Write-Host "Computer Name : "$computer.Name 
    Write-Host "_____________________________________" 
    Write-Host "" 
    Write-Host "Group Name : "$Group.Name 
    Write-Host "_____________________________________" 

    $domain = $group.Path.Split("/")[2] 
    $string1 = "WinNT://" + $domain + "/" + $_ + "/" 
    $string2 = $_ + "/" 
    $string3 = "WinNT://" 

    $members = ($group.PSBase.Invoke("Members") | Foreach-Object {$_.GetType().InvokeMember("Adspath", 'GetProperty', $null, $_, $null)}) -replace ($string1,$string2) -replace ($string3,"") 

    Write-Host "" 
    Write-Host "Members : " 
    Write-Host "" 
    $members 
} | Set-Content 'C:\Users\herbautr\Desktop\administrators.txt' 

我加1级的计算机名称到List1.txt:

01SPEAI-TEST1 
01SPEAI-TEST2 
02SPHPV-TEST1 
01SLCPTAAP-PROD

和它的作品(不)完美(不可读布局)

01SPEAI-PROD1/Administrator 
VNF-PRINCIPAL/Admins du domaine 
VNF-PRINCIPAL/svceri 
01SPEAI-PROD2/Administrator 
VNF-PRINCIPAL/Admins du domaine 
VNF-PRINCIPAL/svceri 
02SPHPV-PROD1/Administrator 
VNF-PRINCIPAL/Admins du domaine 
01SLCPTAAP-PROD/Administrator 
VNF-PRINCIPAL/Admins du domaine 
01SLCPTAAP-PROD/maint 
VNF-PRINCIPAL/svcoraas 
VNF-PRINCIPAL/svcvisionit 
VNF-PRINCIPAL/GopOAS 
VNF-PRINCIPAL/svcdigora 

注(15:18 pm):我试着用5个名字,它继续工作..

为什么只添加1个名字它“有效”? Oo'

+0

检查“$ _”是否是您认为的。 “Write-Host”的输出是什么 - $ _-“'? –

+0

@Ansgar好的我明白了,我已经做了这个检查$ _ =“lol” 写主机“$ _”(显示我哈哈)我明白了。但是,我应该在Get-Content之前定义$ _还是可以按照我想要的方式重新设置$ _? – Skyxia

+0

你应该在你的循环中加入'Write-Host' - $ _-“'并且报告输出结果。正如我在这里所说的那样,使用陈述*。不要留下任何东西。不要添加任何东西。 –

回答

1

您正在查找的是Get-ContentSet-Content

Get-Content 'C:\path\to\computers.txt' | ForEach-Object { 
    $computer = [ADSI]("WinNT://" + $_ + ",computer") 
    ... 
} | Set-Content 'C:\path\to\administrators.txt' 

请注意,您需要与当前对象automatic variable$_)取代ForEach-Object循环内的$strComputer所有出现。

如果要使用CSV作为输入和输出,请使用Import-CsvExport-Csv cmdlet。

Import-Csv 'C:\path\to\computers.csv' | ForEach-Object { 
    $computer = [ADSI]("WinNT://" + $_.ComputerName + ",computer") 
    ... 
    $members | ForEach-Object { 
    New-Object -Type PSObject -Property @{ 
     Member = $_ 
    } 
    } 
} | Export-Csv 'C:\path\to\administrators.csv' -NoType 

注意CSV中有一定的优势,当你需要处理多个属性的项目,但他们需要有些更复杂的处理不是简单的字符串(你可以在我的例子参见上文)。