Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Powershell Script not recognising ForEach-Object as a valid cmdlet

I have writen a powershell script to make ammendments to Active Directory. I am Getting a funny error. Here is the script.

    #imports the module active directory if it isn't there.
function add-ADmodule()
            {
            $modules = Get-Module | Where-Object{$_.Name -like "*ActiveDirectory*"}

            if($modules -eq $null)
                {
                Import-Module ActiveDirectory
                }
            }

#import the data file
$user_csv = import-csv C:\temp\users.csv

#makes the ammendments to the AD object
function ammend-ADUsers($user_csv)
    {#this is the loop to make ammendments to each object
        $users_csv|ForEach-Object`
                {
                #assigns each user's AD object to a variable
                $user_object = get-aduser -filter * `
                                          -Properties mail |`
                              Where-Object{$_.mail -like $_."Email Address"}

                #ammends the ad object in the above variable
                set-aduser -Identity $user_object `
                           -OfficePhone $_."Office Number" `
                           -MobilePhone $_."Mobile Number" `
                           -StreetAddress $_."Street" `
                           -City $_."City" `
                           -PostalCode $_."PostCode"    
                }
    }


#this is the main part of the code where it gets executed

add-ADmodule
Write-Verbose "Active Directory Module Added"

ammend-ADUsers($user_csv)

This is the error I am getting.

PS C:\Users\admin> C:\Scripts\ammend-aduser.ps1
ForEach-Object : The term 'ForEach-Object' is not recognized as the name of a 
cmdlet, function, script file, or operable program. Check the spelling of the 
name, or if a path was included, verify that the path is correct and try again.
At C:\Scripts\ammend-aduser.ps1:18 char:20
+         $users_csv|ForEach-Object`
+                    ~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (ForEach-Object:String) [], Com  
  mandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

I am not not sure what could be causing this error or why it is happening.


1 Answers

Your issue is because you have not put a space between the cmdlet and the backtick character, but it would be better to not use a backtick and instead just keep the opening curly brace { on the same line:

$users_csv|ForEach-Object {

You also don't need a backtick after a pipe character. You might want to also consider using splatting instead of backticks to improve your formatting (backticks are generally discouraged as they can be hard to see and easy to use improperly). I suggest the following revision:

$users_csv | ForEach-Object {
        #assigns each user's AD object to a variable
        $user_object = Get-ADUser -filter * -Properties mail |
                       Where-Object{$_.mail -like $_."Email Address"}

        $Props = @{
             Identity = $user_object
             OfficePhone = $_."Office Number"
             MobilePhone = $_."Mobile Number"
             StreetAddress = $_."Street"
             City = $_."City"
             PostalCode = $_."PostCode"    
        }
        #ammends the ad object in the above variable
        Set-ADUser @Props
    }
like image 195
Mark Wragg Avatar answered May 19 '26 02:05

Mark Wragg



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!