Function wrong?

Tagged: 

This topic contains 4 replies, has 3 voices, and was last updated by  Rob Simmers 9 months, 1 week ago.

  • Author
    Posts
  • #60141

    Tony Antony
    Participant

    Hello,

    I asked this question yesterday, and I thought I got it working but it's not. My first issue is that, when I enter a new email address, it adds it to the list, but it doesn't number it. If I enter another email, it numbers the previous email correctly, but not the new one. Basically, it doesn't number the latest email address.

    I'm almost certain my function calls are not in the correct order, but I can't figure it out.

    I want it to number the email addresses when they're created, not the next time a new email is added.

    Example:

    [1] Create new user
    [2] Delete a user
    [3] Add user to calender
    [0] Exit menu

    Please select an option and press ENTER: 1

    Enter new employee's account name: gps@company.com
    [1] Create new user
    [2] Delete a user
    [3] Add user to calender
    [0] Exit menu

    It created gps@company.com, but didn't number it

    Please select an option and press ENTER: 1

    Enter new employee's account name: wcs@company.com
    [1] Create new user
    [2] Delete a user
    [3] Add user to calender
    [0] Exit menu

    Please select an option and press ENTER: 0

    It created wcss@company.com, but didn't number it, it numbered gps@company.com

    This is what this looks like now. Notice the number before gps, and no number before wcs. It added 1443 after I entered wcs.

    1443=gps@company.com
    wcs@company.com

    $MenuChoice = $null
    
    While($MenuChoice -ne 0)
    {
        $INI_Location = '\\hqfs1\users\tantony\PowerShell\CalenderGroup\config.ini'
        $Read_INI = Get-Content $INI_Location
    
        $GroupCalendars = ($Read_INI | Select-String -Pattern "[GroupCalendars]" -SimpleMatch).LineNumber
        $Users = ($Read_INI | Select-String -CaseSensitive "[Users]" -SimpleMatch).LineNumber
        $Calender_Groups = ($Read_INI | Select-String -CaseSensitive "[MembersOf-1]" -SimpleMatch).LineNumber - 2
        $Calender_Option = $Read_INI[$GroupCalendars..$Users]
    
        function Create_User
            {
                $New_User = Read-Host "Enter new employee's account name"
                $Read_INI[$Calender_Groups] += "`r`n$New_User"
                Reindex_Users
                $Read_INI | Set-Content $INI_Location -Force                     
            }
    
        function Delete_User
            {
                $Del_User = Read-Host "Enter the email you want to delete"
                $Read_INI | where {$_ -ne $Del_User} | Set-Content $INI_Location -Force              
            }
    
        function Find_User_Index ([string]$email)
            {
                $E = ($Read_INI | Select-String -AllMatches "$email" -SimpleMatch)
                $E.ToString().Trim("=$email")
            }
    
        function Add_User_To_Calender
            {
                $Get_User = Read-Host "Enter email address of the employee to add"
                $Calender_Option
                $Get_Calender = Read-Host "Which calenders do you want to add" $Get_User "to?" 
                $Calender =  ($Calender_Option[$Get_Calender - 1])
                $Start = ($Read_INI | Select-String -Pattern "[MembersOf-$Get_Calender]" -SimpleMatch).LineNumber
                $Next_Group = ($Read_INI[$Start..$Read_INI.Count] | Select-String -AllMatches "[Membersof" -SimpleMatch) | Select-Object -First 1
                $End = ($Read_INI | Select-String -AllMatches "$Next_Group" -SimpleMatch).LineNumber - 2
                $Line = $End - $Start
                $User = Find_User_Index $Get_User  
                $Write = "$Line=$User"
                $Read_INI[$End] += "`r`n$Write"
                $Read_INI | Set-Content $INI_Location -Force                                      
            }
    
        function Reindex_Users
            {
                $List_of_Users = $Read_INI[$Users..$Calender_Groups]
            
                For($Index=0; $Index -lt $List_of_Users.length; $Index++)
                    {            
                        $Email = ($List_of_Users[$Index]) -creplace '^[^=]*=', ''
                        $Index_Plus_One = $Index + 1
                        $Re_Index = "$Index_Plus_One=$Email"  
                        $Read_INI[$Index+$Users] = ""           
                        $Read_INI[$Index+$Users] += $Re_Index
                    }        
    
                    #$Read_INI | Set-Content $INI_Location -Force
    
                    
            }
    
        switch ($MenuChoice)
        {
            1 {Create_User}
            2 {Delete_User}
            3 {Add_User_To_Calender}
        }
        
        Write-Host "[1]`tCreate new user"
        Write-Host "[2]`tDelete a user"
        Write-Host "[3]`tAdd user to calender"
        Write-Host "[0]`tExit menu"
    
        $MenuChoice = Read-Host "`nPlease select an option and press ENTER" 
        
        Write-Host "`n"
    }

    Thank you,

    Tony

  • #60148

    Tony Antony
    Participant

    Not a function issue, but a logic / syntax issue. I know what the problem is, just trying to figure out how to properly code it now.

  • #60159

    Max Kozlov
    Participant

    You have a logic error when you add new user like this $Read_INI[$Calender_Groups] += "`r`n$New_User"
    and when you reindex your data, you have last user like "123=OldUser`r`nNewUser". but not two different lines as you await.

    but... you overcomplicate things when you try to work with different objects based on line numbers and strings. Powershell is object oriented language, try to use objects

    for example you may try to use function like this https://gallery.technet.microsoft.com/scriptcenter/ea40c1ef-c856-434b-b8fb-ebd7a76e8d91 to import ini file and work with your data as with hashtables but not strings and then export it back as you like.>

  • #60243

    Tony Antony
    Participant

    I actually have it working now the way I want, except one thing.

    Once I add a new email address, it won't index it correctly unless I add a new email address.

    $MenuChoice = $null
    
    While($MenuChoice -ne 0)
    {
        $INI_Location = '\\hqfs1\users\tantony\PowerShell\CalenderGroup\config.ini'
        $Read_INI = Get-Content $INI_Location
    
        $GroupCalendars = ($Read_INI | Select-String -CaseSensitive "[GroupCalendars]" -SimpleMatch).LineNumber
        $Users = ($Read_INI | Select-String -CaseSensitive "[Users]" -SimpleMatch).LineNumber
        $Calender_Groups = ($Read_INI | Select-String -CaseSensitive "[MembersOf-1]" -SimpleMatch).LineNumber - 2
        $Calender_Option = $Read_INI[$GroupCalendars..$Users]
    
        function Create_User
            {
                $New_User = Read-Host "Enter new employee's account name"
                $Read_INI[$Calender_Groups] += "`r`n$New_User"
                Reindex_Users                                                
            }
    
        function Delete_User
            {
                $Del_User = Read-Host "Enter the email you want to delete"
                $Read_INI | where {$_ -ne $Del_User} | Set-Content $INI_Location -Force              
            }
    
        function Find_User_Index ([string]$email)
            {
                $E = ($Read_INI | Select-String -AllMatches "$email" -SimpleMatch)
                $E.ToString().Trim("=$email")
            }
    
        function Add_User_To_Calender
            {
                $Get_User = Read-Host "Enter email address of the employee to add"
                $Calender_Option
                $Get_Calender = Read-Host "Which calenders do you want to add" $Get_User "to?" 
                $Calender =  ($Calender_Option[$Get_Calender - 1])
                $Start = ($Read_INI | Select-String -CaseSensitive "[MembersOf-$Get_Calender]" -SimpleMatch).LineNumber
                $Next_Group = ($Read_INI[$Start..$Read_INI.Count] | Select-String -AllMatches "[Membersof" -SimpleMatch) | Select-Object -First 1
                $End = ($Read_INI | Select-String -CaseSensitive "$Next_Group" -SimpleMatch).LineNumber - 2
                $Line = $End - $Start
                $User = Find_User_Index $Get_User  
                $Write = "$Line=$User"
                $Read_INI[$End] += "`r`n$Write"
                $Read_INI | Set-Content $INI_Location -Force                                      
            }
    
        function Reindex_Users
            {
                $List_of_Users = $Read_INI[$Users..$Calender_Groups]
    
                For($Index=0; $Index -lt $List_of_Users.length; $Index++)
                {
                    $Index_Plus_One = $Index + 1;
                    $Email = ($List_of_Users[$Index]) -creplace '^[^=]*=', ''                    
                    $Re_Index = "$Index_Plus_One" + "=" +$Email
                    $Read_INI = $Read_INI | Where-Object {$_ -ne $List_of_Users[$Index]}
                    $Read_INI[$Users - 1] += "`r`n$Re_Index"
                    $Read_INI | Set-Content $INI_Location -Force
                }        
            }
    
        switch ($MenuChoice)
        {
            1 {Create_User}
            2 {Delete_User}
            3 {Add_User_To_Calender}
        }
        
        Write-Host "[1]`tCreate new user"
        Write-Host "[2]`tDelete a user"
        Write-Host "[3]`tAdd user to calender"
        Write-Host "[0]`tExit menu"
    
        $MenuChoice = Read-Host "`nPlease select an option and press ENTER" 
        
        Write-Host "`n"
    }
  • #60289

    Rob Simmers
    Participant

    You have a ReIndex_Users function. The only place the function is called is Create_User, which is what is "working". If you make any change to the file, it has to be re-indexed. So, it's preferable to call the function after your switch statement, but you can call it in each function if you want.

You must be logged in to reply to this topic.