我目前正在制作一个脚本,该脚本应该连接到42个不同的本地服务器,并从活动目录中获取特定组(fj rrskrivbordsanv N乍(瑞典语的远程桌面用户)的用户)。在从服务器获得所有用户之后,必须将用户导出到我桌面上的一个文件中。
csv文件必须如下所示:
Company;Users
LawyerSweden;Mike
LawyerSweden;Jennifer
Stockholm Candymakers;Pedro
(Examples)
etc.下面是到现在为止的代码:
cls
$MolnGroup = 'fjärrskrivbordsanvändare'
$ActiveDirectory = 'activedirectory'
$script:CloudArray
Set-Variable -Name OutputAnvandare -Value ($null) -Scope Script
Set-Variable -Name OutputDomain -Value ($null) -Scope Script
function ReadInfo {
Write-Host("A")
Get-Variable -Exclude PWD,*Preference | Remove-Variable -EA 0
if (Test-Path "C:\file\frickin\path.txt") {
Write-Host("File found")
}else {
Write-Host("Error: File not found, filepath might be invalid.")
Exit
}
$filename = "C:\File\Freakin'\path\super.txt"
$Headers = "IPAddress", "Username", "Password", "Cloud"
$Importedcsv = Import-csv $filename -Delimiter ";" -Header $Headers
$PasswordsArray += @($Importedcsv.password)
$AddressArray = @($Importedcsv | ForEach-Object { $_.IPAddress } )
$UsernamesArray += @($Importedcsv.username)
$CloudArray += @($Importedcsv.cloud)
GetData
}
function GetData([int]$p) {
Write-Host("B")
for ($row = 1; $row -le $UsernamesArray.Length; $row++)
{
# (If the customer has cloud-service on server, proceed)
if($CloudArray[$row] -eq 1)
{
# Code below uses the information read in from a file to connect pc to server(s)
$secstr = New-Object -TypeName System.Security.SecureString
$PasswordsArray[$row].ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $UsernamesArray[$row], $secstr
# Runs command on server
$OutputAnvandare = Invoke-Command -computername $AddressArray[$row] -credential $cred -ScriptBlock {
Import-Module Activedirectory
foreach ($Anvandare in (Get-ADGroupMember fjärrskrivbordsanvändare))
{
$Anvandare.Name
}
}
$OutputDomain = Invoke-Command -computername $AddressArray[$row] -credential $cred -ScriptBlock {
Import-Module Activedirectory
foreach ($Anvandare in (Get-ADGroupMember fjärrskrivbordsanvändare))
{
gc env:UserDomain
}
}
$OutputDomain + $OutputAnvandare
}
}
}
function Export {
Write-Host("C")
# Variabler för att bygga up en CSV-fil genom Out-File
$filsökväg = "C:\my\file\path\Coolkids.csv"
$ColForetag = "Company"
$ColAnvandare = "Users"
$Emptyline = "`n"
$delimiter = ";"
for ($p = 1; $p -le $AA.Length; $p++) {
# writes out columns in the csv file
$ColForetag + $delimiter + $ColAnvandare | Out-File $filsökväg
# Writes out the domain name and the users
$OutputDomain + $delimiter + $OutputAnvandare | Out-File $filsökväg -Append
}
}
ReadInfo
Export我的问题是,我不能导出用户或域。如您所见,我试图使变量对整个脚本全局化,但是$outputanvandare和$outputdomain只包含了我在foreach循环中需要的信息。如果我想把它们打印出来,它们是空的?!
发布于 2016-07-29 15:11:18
既然你提到你想学,我希望你原谅我的回答,这比平时长了一点。
这里影响您的问题是PowerShell变量的作用域。当您执行$outputAvandare和$outputDomain的值时,它们只存在于该函数运行的时间内。
Function variables last until the function ends.
Script variables last until the script ends.
Session/global variables last until the session ends.
Environmental variable persist forever.如果您想从它们中获取值,可以使用以下语法使它们成为全局变量:
$global:OutputAnvandare = blahblahblah虽然这将是您的代码最简单的修复方法,但全局变量在PowerShell中受到反对,因为它们破坏了变量作用域的正常PowerShell期望。
更好的解决方案:)
不要沮丧,实际上您已经有了一个符合PowerShell设计规则的非常好的解决方案。
今天,您的GetData函数获取我们想要的值,但它只将它们发送到控制台。您可以在GetData的这一行中看到这一点
$OutputDomain + $OutputAnvandare这就是我们所称的发射一个对象,或者将数据发送到控制台。我们需要存储这些数据,而不仅仅是编写数据。因此,不要像今天这样简单地调用函数,而是这样做:
$Output = GetData然后,您的函数将运行并捕获所有AD用户,等等,我们将获取结果并将其填充到$output中。然后,您可以稍后导出$output的内容。
https://stackoverflow.com/questions/38661343
复制相似问题