Splatting on powershell 的正确语法是什么?

what is the right syntax for Splatting on powershell?

好的伙计们,我已经编辑了我的用户创建脚本,现在它几乎是完美的,除了一件事我想不通

如何生成散列 table 读取“$GivenName $Surname”的变量 并创建用户的名称,因为现在它正在创建没有名称参数的用户

或者我需要在 csv 文件中为 $GivenName 和 $surname 创建 header

    cls

#get the csv file
$filepath = import-csv "C:\users.csv" 

#set the variable for the uers
$newusers = $filepath


#set Passwords for new users 
$securepassword = ConvertTo-SecureString "BlahBlah" -AsPlainText -Force


foreach ($user in $newusers) {

#get user information

    $User_Creation_Settings = @{

    Name                  = "$GivenName $Surnam"
    GivenName             = $user.GivenName
    Surname               = $user.Surnam
    UserPrincipalName     = $user.UserPrincipalName
    SamAccountName        = $user.SamAccountName
    Path                  = $user.Path
    ScriptPath            = $user.ScriptPath
    ChangePasswordAtLogon = $false
    Department            = $user.Department
    DisplayName           = $user.DisplayName
    Description           = $user.Description
    Title                 = $user.'Job Title'
    AccountPassword       = $securepassword
    Enabled               = $true

}

New-ADUser @User_Creation_Settings



#Get Groups information
$group1 = $user.Group1
$group2 = $user.Group2
$group3 = $user.Group3
$group4 = $user.Group4


#Add the users in to Groups

 Add-ADPrincipalGroupMembership -Identity $user.SamAccountName -MemberOf $user.group1
 Add-ADPrincipalGroupMembership -Identity $user.SamAccountName -MemberOf $user.group2
 Add-ADPrincipalGroupMembership -Identity $user.SamAccountName -MemberOf $user.group3
Add-ADPrincipalGroupMembership -Identity $user.SamAccountName -MemberOf $user.group4



Write-Host "`n"
Write-Host "The account for $GivenName $Surnam created in $OuPath successfully "


}
pause

所以我已经弄明白了,我正在发布解决方案

为了解决我所描述的问题,我必须让 Powershell 认为 "First name" 和 "Last Name" 是一个完整的变量,在中间分开,这就是我的原因如果你在括号前使用了“$”符号,Power Shell 会认为你正在使用循环中的 $user,并且会 "Popup" 来自 CSV 文件的 headers .

这是整个脚本

    cls

#get the csv file
$filepath = import-csv "C:\users.csv" 

#set the variable for the uers
$newusers = $filepath


#set Passwords for new users 
$securepassword = "BlahBlah"


foreach ($user in $newusers) {

#get user information

    $User_Creation_Settings = @{

    Name                  = "$($user.'First Name') $($user.Lastname)"
    GivenName             = $user.'First Name'
    Surname               = $user.Lastname
    UserPrincipalName     = $user.UserPrincipalName
    SamAccountName        = $user.SamAccountName
    Path                  = $user.Path
    ScriptPath            = $user.ScriptPath
    ChangePasswordAtLogon = $false
    Department            = $user.Department
    DisplayName           = $user.DisplayName
    Description           = $user.Description
    Title                 = $user.'Job Title'
    AccountPassword       = ConvertTo-SecureString $securepassword -AsPlainText -Force
    Enabled               = $true

}

New-ADUser @User_Creation_Settings



#Get Groups information
$group1 = $user.Group1
$group2 = $user.Group2
$group3 = $user.Group3
$group4 = $user.Group4


#Add the users in to Groups

 Add-ADPrincipalGroupMembership -Identity $user.SamAccountName -MemberOf $user.group1
 Add-ADPrincipalGroupMembership -Identity $user.SamAccountName -MemberOf $user.group2
 add-ADPrincipalGroupMembership -Identity $user.SamAccountName -MemberOf $user.group3
 Add-ADPrincipalGroupMembership -Identity $user.SamAccountName -MemberOf $user.group4



Write-Host "`n"
Write-Host "The account for $($user.'First Name') $($user.Lastname) created in $($user.Path) successfully "


}
pause

那么在那种情况下:"$($user.'First Name') $($user.Lastname)"

powershell 的行为就像您输入了一个完整的变量。

简短的回答是两者都很好,因为它们都是在 PowerShell 中创建哈希表的有效方法。有关详细信息,请查看 about_Splatting.

就我个人而言,我在整个字符串周围使用单引号并单独保留变量,这样 PowerShell 就不会认为我在尝试调用函数。如前所述,这不是必需的,坦率地说,这会使您的代码看起来比需要的更混乱。

注意事项:

Name      = $firstname $lastname    # invalid because of the space
'class'   = win32_logicaldisk       # invalid: PowerShell will look for the function win32_logicaldisk
GivenName = '$firstname'            # because single quotes are used, PowerShell will not replace the variable; GivenName will literally be $firstname

上面的splatting都很好,颜色变化的原因在第一个哈希表中"$firstname $lastname"是一个字符串,正如你在引号中提到的那样,编辑器代表棕色的字符串和黑色的变量.

在第二个哈希表中,您对所有键和值都使用了单引号,编辑器再次理解并表示为字符串。

两种方式都没有伤害。