We upgraded our ETL box from WS 2003 to 2008. Win Server 2008's scheduled task system is completely revamped (meaning you can't just drag tasks over).
I wrote this little script to:
- Read all the tasks into a CSV
- Loop thru each task, replace a executable path (due to install differences) and output to the new XML format for WS 2008.
- *Optional - actually import the tasks using the 'CREATE' command of schtasks
#### Upgrade WS2003 scheduled tasks to WS2008 format
# Vars
$remote_server = "yourserver.domain.com"
$xml_destination = "c:\"
$nl = [Environment]::Newline
# Get data from schtasks query
$task_data = schtasks /Query /S $remote_server /FO csv
# Parse CSV
$task_data_csv = ConvertFrom-Csv $task_data
# Loop thru CSV, building string and concatenating to output
Foreach($entry in $task_data_csv)
{
#Trim leading \ from output
$task_name = $entry.TaskName.TrimStart("\")
#build export path
$exported_task_path = "" + $xml_destination + $task_name + ".xml"
try {
#Run command; stuff returned data into variable
$xmldata = schtasks /query /s $remote_server /tn "$task_name" /xml
### OPTIONAL XML REGEX STRING REPLACE ###
# I needed to remap a bunch of strings to match our new server environment - you may not need this
$OFS="`r"
$old_status = "(?<=\.*?)(\true\ )"
$new_status = "false "
$xmldata = [regex]::Replace($xmldata, $old_status, $new_status, "Multiline")
$old_path = "c:\oldinstallpath\bin"
$new_path = "c:\newinstallpath\c10_64\bin"
$xmldata = [regex]::Replace($xmldata, [regex]::Escape($old_path), $new_path, "Multiline")
$old_user = "OldComp\username"
$new_user = "NewComp\username"
$xmldata = [regex]::Replace($xmldata, [regex]::Escape($old_user), $new_user, "Multiline")
$old_LogonElement = "InteractiveTokenOrPassword "
$new_LogonElement = "InteractiveToken "
$xmldata = [regex]::Replace($xmldata, [regex]::Escape($old_LogonElement), $new_LogonElement, "Multiline")
$xmldata = $xmldata.split("`r")
### END OPTIONAL XML REGEX STRING REPLACE ###
$xmldata | out-file $exported_task_path
Try{
schtasks /Create /XML "$exported_task_path" /TN "TASKS_FOLDERNAME_HERE\$task_name" /F
}
Catch{
Write-host "[ERROR] ** Task: " + $task_name + "Could not be imported"
Write-host "[ERROR] ** Error message was: " + $_.Exception.ToString()
}
}
catch [exception] {
Write-host "[ERROR] ** The following command errored during the run: " + $output_text
Write-host "[ERROR] ** Error message was: " + $_.Exception.ToString()
}
}
No comments:
Post a Comment