omar180791
omar180791

Reputation: 39

Add time in output file

This script add domain users to any other or remote domain computer / system's 'Administrators' group through the PowerShell.

This returns a final status in a csv with three columns (Computer name, availability, status)

I need to add a fourth column to this output file that contains the time and date.

#Create a file in the required path and update in the below command line
$Output = "C:\CSV\Output.csv" 
#The output field of the computer will blank if the user is already exist in the group
Add-Content -Path $Output -Value "ComputerName,Availability,Status"
$status = $null
$availability = $null
#Save the CSV (Comma seperated) file with the server host name and the username to be added
Import-Csv C:\CSV\Computer.csv | ForEach-Object {
    $Computer=$_.Computer
    $User=$_.user
    if (Test-Connection -ComputerName $Computer -Count 1 -Quiet) {
        Write-Verbose "$Computer : Online"
        $availability="Oniline"
        try {
            $GroupObj=[ADSI]"WinNT://$Computer/Administrators,group"
            $GroupObj.PSBase.Invoke("Add",([ADSI]"WinNT://jdom.edu/$User").Path)
            $status="Success"
            #Update the status in the output file
            Add-Content -Path $Output -Value ("{0},{1},{2}" -f $Computer, $availability, $status)
        } catch {
            Write-Verbose "Failed"
        }
    } else {
        Write-Warning "$Computer : Offline"
        $availability = "Offline"
        $status = "failed"
        #Update the status in the output file
        Add-Content -Path $Output -Value ("{0},{1},{2}" -f $Computer, $availability, $status)
    }
}

This is how the output file looks, this is where I want to add the fourth column with date and time:

ComputerName,Availability,Status
TD123696WJN339P,Oniline,Success
TD123419WJN339P,Oniline,Success
ComputerName,Availability,Status
5VERF9097LTIO01,Offline,failed
ZF001024DJH706G,Offline,failed
5MICF9017LTIO01,Offline,failed

Upvotes: 0

Views: 141

Answers (2)

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200273

The simple approach would be to just add another field to your output, i.e.

Add-Content -Path $Output -Value "ComputerName,Availability,Status,Timestamp"

and

"{0},{1},{2},{3}" -f $Computer, $availability, $status, (Get-Date)

However, unless you actually want multiple header lines in your output file (why?) you should rather use calculated properties and Export-Csv.

Import-Csv 'input.csv' |
    Select-Object Computer, User, @{n='Status';e={
        if (Test-Connection -ComputerName $_.Computer -Count 1 -Quiet) {
            ...
        } else {
            ...
        }
    }}, @{n='Timestamp';e={Get-Date}} |
    Export-Csv 'output.csv' -NoType

Upvotes: 2

Ivan Mirchev
Ivan Mirchev

Reputation: 839

This is really interesting approach you have there working with CSV and it overcomplicates the scenario a bit (from my perspective and no disrespect!).

Why don't try using a PowerShell Custom Object?

#Create a file in the required path and update in the below command line
$Output = "C:\CSV\Output.csv" 
#The output field of the computer will blank if the user is already exist in the group
Add-Content -Path $Output -Value "ComputerName,Availability,Status"
$status = $null
$availability = $null
#Save the CSV (Comma seperated) file with the server host name and the username to be added
$result = Import-Csv C:\CSV\Computer.csv | ForEach-Object {
    $Computer=$_.Computer
    $User=$_.user
    if (Test-Connection -ComputerName $Computer -Count 1 -Quiet) {
        Write-Verbose "$Computer : Online"
        $availability="Oniline"
        try {
            $GroupObj=[ADSI]"WinNT://$Computer/Administrators,group"
            $GroupObj.PSBase.Invoke("Add",([ADSI]"WinNT://jdom.edu/$User").Path)
            $status="Success"
            #Update the status in the output file
            [PSCustomObject]@{
                Computer = $Computer
                Availability = $availability
                Status = $status
                Date = Get-Date
            }
        } catch {
            Write-Verbose "Failed"
        }
    } else {
        Write-Warning "$Computer : Offline"
        $availability = "Offline"
        $status = "failed"
        #Update the status in the output file
        [PSCustomObject]@{
            Computer = $Computer
            Availability = $availability
            Status = $status
            Date = Get-Date
        }
    }
}

$result | Export-Csv -Path $Output -NoTypeInformation

This way, you will store the result into the $result variable and will be able to export it as CSV, without any complication. Using PowerShell Custom Object is a great way to store data from different sources and provide the output in the way you would like to see it.

Give it a try and provide a feedback, if you would like :)

Upvotes: 0

Related Questions