Friday, August 31, 2018

GIT ssl error

I got an ssl error executing git commands.

eg:

$ git push origin master
fatal: unable to access 'https://github.com/vrtugit/git-github.git/': SSL certificate problem: self signed certificate in certificate chain


Solution ( Workaround)

switch off ssl verification

 git -c http.sslVerify=false push origin master

Thursday, August 16, 2018

To be Professional

To be Professional
1. Analytical and Problem solving skill
2. Technical skill
3. Domain knowledge
4. Communication skills - u don't have to be expert, but to be good at with it
5. How to learn

XML Short Note


XML Basics

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
</bookstore>

A prolog defines the XML version and the character encoding: this line is called “prolog”
<?xml version="1.0" encoding="UTF-8"?>

next line is the root element of the document:

<bookstore>

The next line starts a <book> element: child element
<book category="cooking">

Every tag should have a closing tag.

Attribute values must always be quoted.

<note date="12/11/2007">
  <to>Tove</to>
  <from>Jani</from>
</note>

Entity References
Character like "<" has special meaning
This will generate an XML error:
<message>salary < 1000</message>
To avoid this error, replace the "<" character with an entity reference:
<message>salary < 1000</message>

< < less than
> > greater than
& & ampersand 
' ' apostrophe
" " quotation mark












<!-- This is a -- comment -->
 Strange, but allowed:
<!-- This is a - - comment -->
White-space is Preserved in XML
XML does not truncate multiple white-spaces (HTML truncates multiple white-spaces to one single white-space):

XML: Hello           Tove
HTML: Hello Tove

XML Stores New Line as LF
Windows applications store a new line as: carriage return and line feed (CR+LF).
Unix and Mac OSX uses LF.
Old Mac systems uses CR.
XML stores a new line as LF.
What is an XML Element?
An XML element is everything from (including) the element's start tag to (including) the element's end tag.
<price>29.99</price>
An element can contain:
text
attributes
other elements
or a mix of the above

<bookstore>
  <book category="children">
    <title>Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>

<title>, <author>, <year>, and <price> have text content because they contain text (like 29.99).
<bookstore> and <book> have element contents, because they contain elements.
<book> has an attribute (category="children").

Note: you can have space after the name given in the start element tag, not before 
<title      >    - allowed
< title>,  -> Disallowed, Illegal

Empty XML Elements
In XML, you can indicate an empty element like this:
<element></element>
Or
<element />

XML Naming Rules
Element names are case-sensitive
Element names must start with a letter or underscore
Element names cannot start with the letters xml (or XML, or Xml, etc)
Element names can contain letters, digits, hyphens, underscores, and periods
Element names cannot contain spaces

Best Naming Practices
Create descriptive names, like this: <person>, <firstname>, <lastname>.
Create short and simple names, like this: <book_title> not like this: <the_title_of_the_book>.
Avoid "-". If you name something "first-name", some software may think you want to subtract "name" from "first".
Avoid ".". If you name something "first.name", some software may think that "name" is a property of the object "first".
Avoid ":". Colons are reserved for namespaces (more later).
Non-English letters like éòá are perfectly legal in XML, but watch out for problems if your software doesn't support them.
Naming Styles
There are no naming styles defined for XML elements. But here are some commonly used:
Style Example Description
Lower case <firstname> All letters lower case
Upper case <FIRSTNAME>
Underscore <first_name> Underscore separates words
Pascal case <FirstName> Uppercase first letter in each word
Camel case <firstName> Uppercase first letter in each word except the first

XML Elements are Extensible
XML elements can be extended to carry more information.
Look at the following XML example:
<note>
  <to>Tove</to>
  <from>Jani</from>
  <body>Don't forget me this weekend!</body>
</note>

Imagine that the author of the XML document added some extra information to it:
<note>
  <date>2008-01-10</date>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

Should the application break or crash?
No. The application should still be able to find the <to>, <from>, and <body> elements in the XML document and produce the same output.
This is one of the beauties of XML. It can be extended without breaking applications.
XML Attributes
Attribute values must always be quoted. Either single or double quotes can be used.
For a person's gender, the <person> element can be written like this:
<person gender="female">
or like this:
<person gender='female'>

If the attribute value itself contains double quotes you can use single quotes, like in this example:
<gangster name='George "Shotgun" Ziegler'>
or you can use character entities: this is more preferable
<gangster name="George "Shotgun" Ziegler">
Note: Metadata (data about data) should be stored as attributes, and the data itself should be stored as elements.

Below is more preferable
<note>
  <date>
    <year>2008</year>
    <month>01</month>
    <day>10</day>
  </date>
  <to>Tove</to>
  <from>Jani</from>
</note>
Avoid XML Attributes?
Some things to consider when using attributes are:
attributes cannot contain multiple values (elements can)
attributes cannot contain tree structures (elements can)
attributes are not easily expandable (for future changes)

Don't end up like this:
<note day="10" month="01" year="2008"
to="Tove" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note>

XML Attributes for Metadata
Sometimes ID references are assigned to elements. These IDs can be used to identify XML elements in much the same way as the id attribute in HTML. This example demonstrates this:
<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
  </note>
</messages>
The id attributes above are for identifying the different notes. It is not a part of the note itself.
Metadata (data about data) should be stored as attributes, and the data itself should be stored as elements.

XML Namespaces
provide a method to avoid element name conflicts.







windows command : findstr


1.       Check pattern start at beginning
h\s1>findstr /b /c:"2017-01-31 11:37:35,85" Test.txt

/b    = from beginning
/c:  = give search string

Some useful SQL Queries


Block queries


SELECT
    spid
    ,sp.status
    ,loginame   = SUBSTRING(loginame, 1, 12)
    ,hostname   = SUBSTRING(hostname, 1, 12)
    ,blk        = CONVERT(char(3), blocked)
    ,open_tran
    ,dbname     = SUBSTRING(DB_NAME(sp.dbid),1,10)
    ,cmd
    ,waittype
    ,waittime
    ,last_batch
    ,SQLStatement       =
        SUBSTRING
        (
            qt.text,
            er.statement_start_offset/2,
            (CASE WHEN er.statement_end_offset = -1
                THEN LEN(CONVERT(nvarchar(MAX), qt.text)) * 2
                ELSE er.statement_end_offset
                END - er.statement_start_offset)/2
        )
FROM master.dbo.sysprocesses sp
LEFT JOIN sys.dm_exec_requests er
    ON er.session_id = sp.spid
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) as qt
WHERE spid IN (SELECT blocked FROM master.dbo.sysprocesses)
AND blocked = 0


      

Kill process  - kill and processID

kill 201;


check Index

select the db and run

SELECT ps.database_id, object_name(ps.OBJECT_ID) as table_name, ps.index_id, b.name as index_name, ps.avg_fragmentation_in_percent,ps.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS ps
INNER JOIN sys.indexes AS b ON ps.OBJECT_ID = b.OBJECT_ID
inner join sys.tables as c ON b.object_id = c.object_id
AND ps.index_id = b.index_id
WHERE ps.database_id = DB_ID()
and b.name is not null
ORDER BY ps.avg_fragmentation_in_percent desc



Check last executed stats


/* 1.Query to check when statistics was last executed */
SELECT
  st.object_id                          AS [Table ID]
, OBJECT_NAME(st.object_id)             AS [Table Name]
, st.name                               AS [Index Name]
, STATS_DATE(st.object_id, st.stats_id) AS [LastUpdated]
, modification_counter                  AS [Rows Modified]
FROM
sys.stats st
CROSS APPLY
sys.dm_db_stats_properties(st.object_id, st.stats_id) AS sp
WHERE
STATS_DATE(st.object_id, st.stats_id)<=DATEADD(DAY,-1,GETDATE()) 
AND modification_counter > 0
AND OBJECTPROPERTY(st.object_id,'IsUserTable')=1
order by OBJECT_NAME(st.object_id)





read sp


sp_helptext 'myDb.spName'



few




SELECT
       r.session_id
       ,st.TEXT AS batch_text
       ,SUBSTRING(st.TEXT, statement_start_offset / 2 + 1, (
                     (
                           CASE
                                  WHEN r.statement_end_offset = - 1
                                         THEN (LEN(CONVERT(NVARCHAR(max), st.TEXT)) * 2)
                                  ELSE r.statement_end_offset
                                  END
                           ) - r.statement_start_offset
                     ) / 2 + 1) AS statement_text
       ,qp.query_plan AS 'XML Plan'
       ,r.*
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) AS qp
ORDER BY cpu_time DESC





select
    P.spid,
       P.status
,   right(convert(varchar,
            dateadd(ms, datediff(ms, P.last_batch, getdate()), '1900-01-01'),
            121), 12) as 'batch_duration'
,   P.program_name
,   P.hostname
,   P.loginame
from master.dbo.sysprocesses P
where P.spid > 50
and      P.status not in ('background', 'sleeping','runnable')
and      P.cmd not in ('AWAITING COMMAND'
                    ,'MIRROR HANDLER'
                    ,'LAZY WRITER'
                    ,'CHECKPOINT SLEEP'
                    ,'RA MANAGER')
order by batch_duration desc





Disable and enable windows taskschedular

move "C:\Windows\System32\Tasks\Test\TestPS" "C:\Windows\System32\Tasks\Test\TestPS.bak"


-- enable

move "C:\Windows\System32\Tasks\Test\TestPS.bak" "C:\Windows\System32\Tasks\Test\TestPS" 

powershell script to get some performance stats

#////////////////////////////////////////////////////////////////////////////////////////////


Param($globalSelectedItems)

foreach ($globalSelectedItem in $globalSelectedItems) {

$selectedObject = $globalSelectedItem["DisplayName"]
$hostpath = $globalSelectedItem["Path"]      #Get the server name
}

$class = get-scomclass -Name Microsoft.Windows.Server.OperatingSystem

#Look for OS instance of server
$selectedserverOS = Get-SCOMClassInstance -class $class | ? {$_.Path -ilike $hostpath}

$dataObject = $ScriptContext.CreateInstance("xsd://OSMEMPROC!val/stat")

$dataObject["Id"] = "ItemSelected"
$dataObject["Path"] = $hostpath

$aggregationInterval = 60

#Last 60 minutes (1hr)
  $dt = New-TimeSpan -minute $aggregationInterval   
  $now = Get-Date 
  $from = $now.Subtract($dt)

#Note: the GetMonitoringPerformanceData retrieves data recorded in UTC. So you may need to add some extra lines in the script to handle that as some local times may be a future date and no data will be returned.

$perfRules = $selectedserverOS.GetMonitoringPerformanceData()

foreach ($perfRule in $perfRules)
{
#Get % Processor Time Stat
if($perfRule.CounterName  -eq "% Processor Time")  {
      $data = $perfRule.GetValues($from, $now) | % { $_.SampleValue } | Measure-Object –Average 
 
     $CPUStat =  [math]::round($data.Average,2)
     $dataObject["CPUStat"] = $CPUStat
  }
#Get % Memory Used Stat
  if($perfRule.CounterName  -eq "PercentMemoryUsed")  {
      $data = $perfRule.GetValues($from, $now) | % { $_.SampleValue } | Measure-Object –Average 

     $MemState = [math]::round($data.Average,2)
     $dataObject["MemStat"] =  $MemState
  }
}

$ScriptContext.ReturnCollection.Add($dataObject)

#////////////////////////////////////////////////////////////////////////////////////////////


Powershell script to send mail


$a = ""

$table1 = Get-Childitem D:\MyFiles | where {$_.LastwriteTime -le (Get-date).AddDays(-7)}|where {$_.Name -like "myFile.xls" }| Select Name,LastWriteTime |ConvertTo-Html -head $a -Property Name,LastWriteTime


$FromEmail="sender@test.com"
$ToEmail="receiver@test.com"
$CcEmail="cc1@test.com;cc2@test.com;cc3@test.com"
$SMTPMail="mailserver.test.com"


 Function sendEmail([string]$emailFrom, [string]$emailTo,[string]$emailCc, [string]$subject,[string]$body,[string]$smtpServer)
{
$email = New-Object System.Net.Mail.MailMessage 
$email.From = $emailFrom
$email.To.Add($emailTo)
$email.Cc.Add($CcEmail)
$email.Subject = $subject
$email.IsBodyHTML = $true
$email.Body = $body
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($email)
}
$date=get-date
$message = "Hi Team,
"
$message += "
"
$message += "Test File file has not been uploaded today
"
$message += "
$table1
"
$message += "Thanks
Test Team
"


sendEmail -emailFrom $fromEmail -emailTo $ToEmail -emailCc $CcEmail -subject "Test file Status -$($date)" -body $message -smtpServer $SMTPMail

Few useful powershell scripts I have worked with

Some useful powershell scripts
--------------------------------

Check file created before date range
-------------------------------------

$lastWrite = (get-item "D:\MYdirectory\myExcel.xls").LastWriteTime
$timespan = new-timespan -days 7 -hours 0 -minutes 0

if (((get-date) - $lastWrite) -gt $timespan)
{
   Write-Host "old";
} else
{
   Write-Host "new";
}





Send mails
-----------


$lastModifiedDate = (Get-Item "D:\Revenue_FTP_Files\FTP_Bottom_Up_Revenue.xls").LastWriteTime;
Write-Host $lastModifiedDate;

$table1 = Get-Childitem D:\Revenue_FTP_Files | where {$_.LastwriteTime -le (Get-date).AddDays(-7)}|where {$_.Name -like "FTP_Bottom_Up_Revenue.xls" }| Select Name,LastWriteTime |ConvertTo-Html -head $a -Property Name,LastWriteTime
Write-Host $table1;


### get details
$Today = Get-Date
$FileDate = (Get-ChildItem "D:\Revenue_FTP_Files\FTP_Bottom_Up_Revenue.xls").LastWriteTime
if ($FileDate -ge $Today){"ok"} else {"not ok"}

Write-Host $Today;
Write-Host $FileDate;

$day = (get-date 10/04/2017).DayOfWeek
Write-Host $day;
$lastWriteshort = (get-item "D:\Revenue_FTP_Files\FTP_Bottom_Up_Revenue.xls").LastWriteTime.ToShortDateString();
Write-Host $lastWriteshort;
Write-Host "------------";
$dateValue = (get-date).ToShortDateString();
Write-Host $dateValue;

if (((get-date) - $lastWrite) -gt $timespan)
{
   Write-Host "old";
} else
{
   Write-Host "new";
}

$lastWrite = (get-item "D:\MyDirectory\myFile.xls").LastWriteTime
$tuesdayTimespan = new-timespan -days 2 -hours 0 -minutes 0
$wednesdayTimespan = new-timespan -days 1 -hours 12 -minutes 0
$thursdayTimespan = new-timespan -days 2 -hours 0 -minutes 0
$fridayTimespan = new-timespan -days 3 -hours 0 -minutes 0
$saturdayTimespan = new-timespan -days 4 -hours 0 -minutes 0
$sundayTimespan = new-timespan -days 6 -hours 0 -minutes 0
$mondayTimespan = new-timespan -days 6 -hours 0 -minutes 0



$day = (get-date).DayOfWeek

if($day -eq "Tuesday" ){
if ((get-date).ToShortDateString() -ne $lastWrite.ToShortDateString())
{
   Write-Host "sending mail";
   sendEmail -emailFrom $fromEmail -emailTo $ToEmail -emailCc $CcEmail -subject "My file file Status -$($date)" -body $message -smtpServer $SMTPMail
}
}
if($day -eq "Wednesday" ){
if (((get-date) - $lastWrite) -ge $wednesdayTimespan)
{
   Write-Host "sending mail.";
   sendEmail -emailFrom $fromEmail -emailTo $ToEmail -emailCc $CcEmail -subject "My file file Status -$($date)" -body $message -smtpServer $SMTPMail
}
}
if($day -eq "Thursday" ){
if (((get-date) - $lastWrite) -ge $thursdayTimespan)
{
   Write-Host "sending mail.";
   sendEmail -emailFrom $fromEmail -emailTo $ToEmail -emailCc $CcEmail -subject "My file file Status -$($date)" -body $message -smtpServer $SMTPMail
}

}
if($day -eq "Friday" ){
if (((get-date) - $lastWrite) -ge $fridayTimespan)
{
   Write-Host "sending mail.";
   sendEmail -emailFrom $fromEmail -emailTo $ToEmail -emailCc $CcEmail -subject "My file file Status -$($date)" -body $message -smtpServer $SMTPMail
}
}
if($day -eq "Saturday" ){
if (((get-date) - $lastWrite) -ge $saturdayTimespan)
{
   Write-Host "sending mail.";
   sendEmail -emailFrom $fromEmail -emailTo $ToEmail -emailCc $CcEmail -subject "My file file Status -$($date)" -body $message -smtpServer $SMTPMail
}
}
if($day -eq "Sunday" ){
if (((get-date) - $lastWrite) -ge $sundayTimespan)
{
   Write-Host "sending mail.";
   sendEmail -emailFrom $fromEmail -emailTo $ToEmail -emailCc $CcEmail -subject "My file file Status -$($date)" -body $message -smtpServer $SMTPMail
}
}
if($day -eq "Monday" ){
if (((get-date) - $lastWrite) -ge $mondayTimespan)
{
   Write-Host "sending mail.";
   sendEmail -emailFrom $fromEmail -emailTo $ToEmail -emailCc $CcEmail -subject "My file file Status -$($date)" -body $message -smtpServer $SMTPMail
}
}






Server Availability
--------------------


 
#### Spreadsheet Location
 $DirectoryToSaveTo = "C:\project\"
 $date=Get-Date -format "yyyy-MM-d"
 $Filename="serverinfo-$($date)"
 $FromEmail="
 $ToEmail="
 $SMTPMail="
 
 ###InputLocation
 $Computers = Get-Content "C:\project\servers.txt"
 
 
# before we do anything else, are we likely to be able to save the file?
# if the directory doesn't exist, then create it
if (!(Test-Path -path "$DirectoryToSaveTo")) #create it if not existing
  {
  New-Item "$DirectoryToSaveTo" -type directory | out-null
  }
 


#Create a new Excel object using COM 
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $True
$Excel = $Excel.Workbooks.Add()
$Sheet = $Excel.Worksheets.Item(1)

$sheet.Name = 'Server Inventory'
#Create a Title for the first worksheet
$row = 1
$Column = 1
$Sheet.Cells.Item($row,$column)= 'Server Inventory'

$range = $Sheet.Range("a1","s2")
$range.Merge() | Out-Null
$range.VerticalAlignment = -4160

#Give it a nice Style so it stands out
$range.Style = 'Title'

#Increment row for next set of data
$row++;$row++

#Save the initial row so it can be used later to create a border
#Counter variable for rows
$intRow = $row
$xlOpenXMLWorkbook=[int]51

#Read thru the contents of the SQL_Servers.txt file

$Sheet.Cells.Item($intRow,1)  ="Name"
$Sheet.Cells.Item($intRow,2)  ="status"
$Sheet.Cells.Item($intRow,3)  ="OS"
$Sheet.Cells.Item($intRow,4)  ="Domain Role"
$Sheet.Cells.Item($intRow,5)  ="ProcessorName"
$Sheet.Cells.Item($intRow,6)  ="Manufacturer"
$Sheet.Cells.Item($intRow,7)  ="Model"
$Sheet.Cells.Item($intRow,8)  ="SystemType"
$Sheet.Cells.Item($intRow,9)  ="Last Boot Time"
$Sheet.Cells.Item($intRow,10) ="Bios Version"
$Sheet.Cells.Item($intRow,11) ="CPU Info"
$Sheet.Cells.Item($intRow,12) ="NoOfProcessors"
$Sheet.Cells.Item($intRow,13) ="Total Physical Memory"
$Sheet.Cells.Item($intRow,14) ="Total Free Physical Memory"
$Sheet.Cells.Item($intRow,15) ="Total Virtual Memory"
$Sheet.Cells.Item($intRow,16) ="Total Free Virtual Memory"
$Sheet.Cells.Item($intRow,17) ="Disk Info"
$Sheet.Cells.Item($intRow,18) ="FQDN"
$Sheet.Cells.Item($intRow,19) ="IPAddress"

for ($col = 1; $col –le 19; $col++)
     {
          $Sheet.Cells.Item($intRow,$col).Font.Bold = $True
          $Sheet.Cells.Item($intRow,$col).Interior.ColorIndex = 48
          $Sheet.Cells.Item($intRow,$col).Font.ColorIndex = 34
     }

$intRow++


Function GetStatusCode

    Param([int] $StatusCode) 
    switch($StatusCode)
    {
        0         {"Success"}
        11001   {"Buffer Too Small"}
        11002   {"Destination Net Unreachable"}
        11003   {"Destination Host Unreachable"}
        11004   {"Destination Protocol Unreachable"}
        11005   {"Destination Port Unreachable"}
        11006   {"No Resources"}
        11007   {"Bad Option"}
        11008   {"Hardware Error"}
        11009   {"Packet Too Big"}
        11010   {"Request Timed Out"}
        11011   {"Bad Request"}
        11012   {"Bad Route"}
        11013   {"TimeToLive Expired Transit"}
        11014   {"TimeToLive Expired Reassembly"}
        11015   {"Parameter Problem"}
        11016   {"Source Quench"}
        11017   {"Option Too Big"}
        11018   {"Bad Destination"}
        11032   {"Negotiating IPSEC"}
        11050   {"General Failure"}
        default {"Failed"}
    }
}


Function GetUpTime
{
    param([string] $LastBootTime)
    $Uptime = (Get-Date) - [System.Management.ManagementDateTimeconverter]::ToDateTime($LastBootTime)
    "Days: $($Uptime.Days); Hours: $($Uptime.Hours); Minutes: $($Uptime.Minutes); Seconds: $($Uptime.Seconds)" 
}

   
   



foreach ($Computer in $Computers)
 {

 TRY {
 $OS = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $Computer
 $Bios = Get-WmiObject -Class Win32_BIOS -ComputerName $Computer
 $sheetS = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $Computer
 $sheetPU = Get-WmiObject -Class Win32_Processor -ComputerName $Computer
 $drives = Get-WmiObject -ComputerName $Computer Win32_LogicalDisk | Where-Object {$_.DriveType -eq 3}
 $pingStatus = Get-WmiObject -Query "Select * from win32_PingStatus where Address='$Computer'"
 $IPAddress=(Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $Computer | ? {$_.IPEnabled}).ipaddress
 $FQDN=[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().Name
 $OSRunning = $OS.caption + " " + $OS.OSArchitecture + " SP " + $OS.ServicePackMajorVersion
 $NoOfProcessors=$sheetS.numberofProcessors
 $name=$SheetPU|select name -First 1
 $Manufacturer=$sheetS.Manufacturer
 $Model=$sheetS.Model
 $systemType=$sheetS.SystemType
 $ProcessorName=$SheetPU|select name -First 1
 $DomainRole = $sheetS.DomainRole
 $TotalAvailMemory = $OS.totalvisiblememorysize/1kb
 $TotalVirtualMemory = $OS.totalvirtualmemorysize/1kb
 $TotalFreeMemory = $OS.FreePhysicalMemory/1kb
 $TotalFreeVirtualMemory = $OS.FreeVirtualMemory/1kb
 $TotalMem = "{0:N2}" -f $TotalAvailMemory
 $TotalVirt = "{0:N2}" -f $TotalVirtualMemory
 $FreeMem = "{0:N2}" -f $TotalFreeMemory
 $FreeVirtMem = "{0:N2}" -f $TotalFreeVirtualMemory
 $date = Get-Date
 $uptime = $OS.ConvertToDateTime($OS.lastbootuptime)
 $BiosVersion = $Bios.Manufacturer + " " + $Bios.SMBIOSBIOSVERSION + " " + $Bios.ConvertToDateTime($Bios.Releasedate)
 $sheetPUInfo = $name.Name + " & has " + $sheetPU.NumberOfCores + " Cores & the FSB is " + $sheetPU.ExtClock + " Mhz"
 $sheetPULOAD = $sheetPU.LoadPercentage
 
 if($pingStatus.StatusCode -eq 0)
    {
        $Status = GetStatusCode( $pingStatus.StatusCode )
    }
else
    {
    $Status = GetStatusCode( $pingStatus.StatusCode )
       }
   
   
 if (($DomainRole -eq "0") -or ($DomainRole -eq "1"))
 {
 $Role = "Work Station"
 }
 elseif (($DomainRole -eq "2") -or ($DomainRole -eq "3"))
 {
 $Role = "Member Server"
 }
 elseif (($DomainRole -eq "4") -or ($DomainRole -eq "5"))
 {
 $Role = "Domain Controller"
 }
 else
 {
 $Role = "Unknown"
 }
 }
 CATCH
 {
 $pcnotfound = "true"
 }
 #### Pump Data to Excel
 if ($pcnotfound -eq "true")
 {
 $sheet.Cells.Item($intRow, 1) = "$($computer) Not Found "
 }
 else
 {
 $sheet.Cells.Item($intRow, 1) = $computer
 $sheet.Cells.Item($intRow, 2) = $status
 $sheet.Cells.Item($intRow, 3) = $OSRunning
 $sheet.Cells.Item($intRow, 4) = $Role
 $sheet.Cells.Item($intRow, 5) = $name.name
 $Sheet.Cells.Item($intRow, 6) = $Manufacturer
 $Sheet.Cells.Item($intRow, 7) = $Model
 $Sheet.Cells.Item($intRow, 8) = $SystemType
 $sheet.Cells.Item($intRow, 9) = $uptime
 $sheet.Cells.Item($intRow, 10)= $BiosVersion
 $sheet.Cells.Item($intRow, 11)= $sheetPUInfo
 $sheet.Cells.Item($intRow, 12)=$NoOfProcessors
 $sheet.Cells.Item($intRow, 13)= "$TotalMem MB"
 $sheet.Cells.Item($intRow, 14)= "$FreeMem MB"
 $sheet.Cells.Item($intRow, 15)= "$TotalVirt MB"
 $sheet.Cells.Item($intRow, 16)= "$FreeVirtMem MB"
 $sheet.Cells.Item($intRow, 19)=$IPAddress
 $sheet.Cells.Item($intRow, 18)=$FQDN

 
$driveStr = ""
 foreach($drive in $drives)
 {
 $size1 = $drive.size / 1GB
 $size = "{0:N2}" -f $size1
 $free1 = $drive.freespace / 1GB
 $free = "{0:N2}" -f $free1
 $freea = $free1 / $size1 * 100
 $freeb = "{0:N2}" -f $freea
 $ID = $drive.DeviceID
 $driveStr += "$ID = Total Space: $size GB / Free Space: $free GB / Free (Percent): $freeb % ` "
 }
 $sheet.Cells.Item($intRow, 17) = $driveStr
 }

 
$intRow = $intRow + 1
 $pcnotfound = "false"
 }

$erroractionpreference = “SilentlyContinue” 

$Sheet.UsedRange.EntireColumn.AutoFit()



$filename = "$DirectoryToSaveTo$filename.xlsx"
if (test-path $filename ) { rm $filename } #delete the file if it already exists
$Sheet.UsedRange.EntireColumn.AutoFit()
$Excel.SaveAs($filename, $xlOpenXMLWorkbook) #save as an XML Workbook (xslx)
$Excel.Saved = $True
$Excel.Close()
$Excel.DisplayAlerts = $False
$Excel.quit()


Function sendEmail([string]$emailFrom, [string]$emailTo, [string]$subject,[string]$body,[string]$smtpServer,[string]$filePath)
{
#initate message
$email = New-Object System.Net.Mail.MailMessage 
$email.From = $emailFrom
$email.To.Add($emailTo)
$email.Subject = $subject
$email.Body = $body
# initiate email attachment 
$emailAttach = New-Object System.Net.Mail.Attachment $filePath
$email.Attachments.Add($emailAttach) 
#initiate sending email 
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($email)
}

#Call Function 

$message = @" 
Hi Team,

The Discovery of Windows Server and Disk Space information for all the listed instances.

Autogenerated Email!!! Please do not reply.

Thank you, 
xyz.com

"@       
$date=get-date

sendEmail -emailFrom $fromEmail -emailTo $ToEmail -subject "Windows Server Inventory & Disk Details -$($date)" -body $message -smtpServer $SMTPMail -filePath $filename




Create Check sum
-----------------

If the content is a string:

$someString = "Hello World!"
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$utf8 = new-object -TypeName System.Text.UTF8Encoding
$hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($someString)))
If the content is a file:

$someFilePath = "C:\foo.txt"
$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($someFilePath)))