Author Posts

May 4, 2015 at 4:26 pm

I recently wrote a script that archives IIS logs into a remote server. The script runs by importing a module that mainly contains functions to copy, zip and remove files. I am populating the script the using a CSV File. which looks like this

[attachment file="Servers.csv"]

In the CSV

The cutoffdate in the CSV represents the retention period for the IISLogs.
I do not want to run the delete action if the copy action returns an error. So, I added a column name called ActionID and PreCheckForActionID.
Later, when the script runs, for every object, I plan to add a new column in the imported CSV called results.. Hence, Before a remove action takes place, I would like to check for the PreCheckForActionID , filter the Action associated with it and check it the action was a success or returned an error.

This is what I have so far and I am completely lost, since I do not know how to go about getting the ActionID related to the PreCheckForActionID object.

{$Newlist = Import-Csv C:\powershell\Servers.csv | Add-Member -MemberType noteproperty -Name Results -Value "success" -PassThru | Select-Object ActionID, Action, ServerName, PreCheckForActionID, Results

$verynew = $Newlist | Select-Object -Property ActionID, Results, PreCheckForActionID | Select-Object -Property ActionID,PreCheckForActionID

foreach($item in $verynew)
{
$item.PreCheckForActionID

}

}

Can someone help me out with the next step on how to correlate my PreCheckForActionID with an ActionID?

May 5, 2015 at 6:20 am

I think this is what you are trying to do. Read through this and validate this the logic:

$csv = @()
$csv += New-Object -TypeName PSObject -Property @{ServerName="Server1";ActionID=1;PreReqActionID=$null}
$csv += New-Object -TypeName PSObject -Property @{ServerName="Server2";ActionID=2;PreReqActionID=1}
$csv += New-Object -TypeName PSObject -Property @{ServerName="Server3";ActionID=3;PreReqActionID=$null}
$csv += New-Object -TypeName PSObject -Property @{ServerName="Server4";ActionID=4;PreReqActionID=2}


#Another method to add a column is just to use Select-Object.  Add-Member you can assign a default value to the objects
$csv = $csv | Select ServerName, ActionID, PreReqActionID, Result

$results = foreach ($item in $csv) {
    #if the PreReqActionID is not null
    if ($item.PreReqActionID) {
        #Cheat a bit and use Write-Host to not return this to the output and result and to illustrate what is happening....
        Write-Host ("Running Pre-Req Action {0} on server {1} before running action {2}" -f $item.PreReqActionID, $item.ServerName, $item.ActionID)
        #Create a new record for the result of the pre-reqID since you are running another action and want to 
        New-Object -TypeName PSObject -Property @{ServerName=$item.ServerName;ActionID=$item.ActionID;PreReqActionID=$item.PreReqActionID;Result="Failed"}
    }
   #Cheat a bit and use Write-Host to not return this to the output and result and to illustrate what is happening....
   Write-Host ("Running Action {0} on server {1}" -f $item.ActionID, $item.ServerName)
   #Assign a success value to Result 
   $item.Result = "Success"
   #We're generating a new object, so enumerate the current row (item) to the $result variable
   $item
}

$results | Format-Table -AutoSize

Output:

Running Action 1 on server Server1
Running Pre-Req Action 1 on server Server2 before running action 2
Running Action 2 on server Server2
Running Action 3 on server Server3
Running Pre-Req Action 2 on server Server4 before running action 4
Running Action 4 on server Server4

ServerName ActionID PreReqActionID Result 
---------- -------- -------------- ------ 
Server1           1                Success
Server2           2 1              Failed 
Server2           2 1              Success
Server3           3                Success
Server4           4 2              Failed 
Server4           4 2              Success