title: Edit value in CSV using powershell
body: <p>For a small project, I want to create AD users from a small CSV file. I made jobs (PowerShell scripts) that run every few minutes, to pick-up the user creation based on the status of the user I define in the script. Per example; when a user is created in the AD, I change the status to <code>addmailbox</code>. Then another job will come and add the mailbox.</p>
  
  <p>Everything is going well, but I noticed a bug. The way I am editing the status in the CSV file is wrong, because I change the status for all users in the CSV when I only want to change one. But I can't seem to get any other method working.</p>
  
  <pre><code>#When encountering any error, stop the script.
  $ErrorActionPreference = "Stop";
  
  #Check if there is a data file.
  $FileExists = Test-Path C:\inetpub\wwwroot\melle\data.csv
  
  if($FileExists -eq $true) {
      $Users = Import-Csv -Path "C:\inetpub\wwwroot\melle\data.csv"
      foreach ($user in $Users) {
          $Status = $User.Status;
          $userPrincipalName = $User.userPrincipalName;
          $SAMAccountName = $User.SAMAccountName;
          $userInstance =  $User.userInstance;
          $Name = $User.Name;
          $displayName = $User.DisplayName;
          $Path = '"' + $User.Path + '"';
          $GivenName = $User.GivenName;
          $Surname = $User.Surname;
          $SIP = $userPrincipalName;
  
          if ($Status -eq "CreateUser") {
              try {
                  #create user
                  Import-Module ActiveDirectory; 
                  New-ADUser -SAMAccountName $SAMAccountName -Instance $userInstance -Name $name -DisplayName $displayName -Path "correct.path.com" -GivenName $givenname -Surname $surname -userPrincipalName $userprincipalname -AccountPassword (ConvertTo-SecureString -String "bla" -AsPlainText -Force) -PassThru | Enable-ADAccount;
  
                  #change status
                  (Get-Content  C:\inetpub\wwwroot\melle\data.csv) | Foreach-Object {$_ -replace 'CreateUser','AddMailbox'}  | Out-File  C:\inetpub\wwwroot\melle\data.csv
  
                  #exit on completion
                  Exit(Write-Host 'User was created in AD.');
              } Catch {
                  #write any errors to error log.
                  $_ | Out-File C:\inetpub\wwwroot\melle\errors.log -Append;
              }
          } else {
              Exit(Write-Host 'No user with status CreateUser was found.');
          }
      }
  }else {
      Exit(Write-Host 'No data.csv file was found.');
  }
  </code></pre>
  
  <p>The way I do it now is <code>(Get-Content  C:\inetpub\wwwroot\melle\data.csv) | Foreach-Object {$_ -replace 'CreateUser','AddMailbox'}  | Out-File  C:\inetpub\wwwroot\melle\data.csv</code> but I want to define it for only the row that the script is talking to in the <code>foreach</code>.</p>
  
  <p>I tried searching for a solution on here and different sites, but I wasn't able to get the solutions others are using to work on my script. Some scripts were too advanced for me to understand.</p>
  
  <p>What would be the correct approach to only change the status for the line I'm working on in the loop?</p>
  
  <p>UPDATE: Solved
  Working script:</p>
  
  <pre><code>#Check if there is a data file.
  $FileExists = Test-Path C:\inetpub\wwwroot\melle\data.csv
  
  if($FileExists -eq $true) {
  $Users = Import-Csv -Path "C:\inetpub\wwwroot\melle\data.csv"
  
  $UsersThatNeedToBeCreated = $Users | Where-Object {$_.Status -eq 'CreateUser'};
  
  # Check that we have users that need to be created, might need fine-tuning.
  if($UsersThatNeedToBeCreated -eq $null -or $UsersThatNeedToBeCreated.Count -eq 0){
      # Write-Host doesn't have a meaningful return code, so you can separate those lines.
  
      Exit(Write-Host 'No user with status CreateUser was found.');
  }else{
      # This way it's only run once
      Import-Module ActiveDirectory; 
  }
  
  $Users | ForEach-Object {
      if($_.Status -eq 'CreateUser'){
          try {
              #create user
              New-ADUser -SAMAccountName $_.SAMAccountName -Instance "'" + $_.userInstance + "'" -Name $_.name -DisplayName $_.displayName -Path "working.path.here" -GivenName $_.givenname -Surname $_.surname -userPrincipalName $_.userprincipalname -AccountPassword (ConvertTo-SecureString -String "Welcome01" -AsPlainText -Force) -PassThru | Enable-ADAccount;
  
              #change status
              $_.Status = 'AddMailbox';
          } Catch {
              #write any errors to error log.
              $_ | Out-File C:\inetpub\wwwroot\melle\errors.log -Append;
          }
      }
  }
  
  $Users | ConvertTo-Csv | Out-File 'C:\inetpub\wwwroot\melle\data.csv'
  
  
  Exit(Write-Host 'User was created in AD.');
  }else {
  
  Exit(Write-Host 'No data.csv file was found.');
  }
  </code></pre>