首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从函数内部修改脚本范围内的变量。

无法从函数内部修改脚本范围内的变量。
EN

Stack Overflow用户
提问于 2016-07-29 14:29:30
回答 1查看 1.4K关注 0票数 1

我目前正在制作一个脚本,该脚本应该连接到42个不同的本地服务器,并从活动目录中获取特定组(fj rrskrivbordsanv N乍(瑞典语的远程桌面用户)的用户)。在从服务器获得所有用户之后,必须将用户导出到我桌面上的一个文件中。

csv文件必须如下所示:

代码语言:javascript
复制
Company;Users
LawyerSweden;Mike
LawyerSweden;Jennifer
Stockholm Candymakers;Pedro
(Examples) 
etc.

下面是到现在为止的代码:

代码语言:javascript
复制
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循环中需要的信息。如果我想把它们打印出来,它们是空的?!

EN

回答 1

Stack Overflow用户

发布于 2016-07-29 15:11:18

既然你提到你想学,我希望你原谅我的回答,这比平时长了一点。

这里影响您的问题是PowerShell变量的作用域。当您执行$outputAvandare$outputDomain的值时,它们只存在于该函数运行的时间内。

代码语言:javascript
复制
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.

如果您想从它们中获取值,可以使用以下语法使它们成为全局变量:

代码语言:javascript
复制
$global:OutputAnvandare = blahblahblah

虽然这将是您的代码最简单的修复方法,但全局变量在PowerShell中受到反对,因为它们破坏了变量作用域的正常PowerShell期望。

更好的解决方案:)

不要沮丧,实际上您已经有了一个符合PowerShell设计规则的非常好的解决方案。

今天,您的GetData函数获取我们想要的值,但它只将它们发送到控制台。您可以在GetData的这一行中看到这一点

代码语言:javascript
复制
 $OutputDomain + $OutputAnvandare

这就是我们所称的发射一个对象,或者将数据发送到控制台。我们需要存储这些数据,而不仅仅是编写数据。因此,不要像今天这样简单地调用函数,而是这样做:

代码语言:javascript
复制
$Output = GetData

然后,您的函数将运行并捕获所有AD用户,等等,我们将获取结果并将其填充到$output中。然后,您可以稍后导出$output的内容。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38661343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档