2012-10-23 92 views
0

我有以下脚本,但需要替换write-host's并将其输出存储为一个变量而不是写入输出 我想最终得到1个变量中的所有输出,I然后可以发送电子邮件的内容。Powershell脚本添加输出到变量

write-host $machines2在循环结束时将每台机器列出到控制台。

# Start writing headers to output 
write-host "  MACHINE USER TAG EXPIRY DATE" 

# Import SQL module for powershell 
import-module SQLPS -DisableNameChecking 

# Run first SQLquery to get machine name & servie tag 
$data1 = Invoke-Sqlcmd -ServerInstance SERVER -Database DATABASE -Query “SELECT guid, name, [Serial Number] FROM dbo.wrksta as a inner join Inv_AeX_HW_Serial_Number as b on a.GUID=b._resourceGUID ORDER BY Name”; 

# Iterate through restults and apply logic to populate list 
foreach ($row in $data1) 
{ 
    # Set variables from Query result 
    $name = $row.name; 
    $serial = $row."Serial Number"; 
    # Get machine user 
    $user = invoke-sqlcmd -ServerInstance SERVER -Database DATABASE -Query “SELECT top 1 [User] FROM dbo.Evt_aex_client_logon WHERE _resourceGuid = (SELECT top 1 Guid FROM dbo.Wrksta WHERE Name='$name' ORDER BY WrkstaID DESC) AND Event = 'logon' AND _eventTime > getdate()-60 GROUP BY [User] ORDER BY count([User]) desc” ; 
    # Set machine user without column header 
    $user2=$user.User; 

    # Set service tag from query data 
    [String]$ServiceTag = $serial; 

    Try 
    { 
     # Function to obtain XML info about dell system from a service tag from Dell xserv site 
     $AssetService = New-WebServiceProxy -Uri "http://xserv.dell.com/services/AssetService.asmx?WSDL"; 
     $ApplicationName = "AssetService"; 
     $Guid = [Guid]::NewGuid(); 
     $Asset = $AssetService.GetAssetInformation($Guid,$ApplicationName,$ServiceTag); 
     $Writer = New-Object "System.IO.StringWriter"; 
     $XmlSerializer = New-Object System.Xml.Serialization.XmlSerializer($Asset.GetType()); 
     $XmlSerializer.Serialize($Writer,$Asset); 
     [String]$Date = $Writer.ToString(); 
     $Writer.Flush(); 
     $Writer.Close(); 
    } 
    # Required exception block 
    Catch 
    { 
     Write-Host $($_.Exception.Message);  
    } 

    # Match purchase date from returned data in incorrect format 2012-03-23 
    $prog = [regex]::match($Date,'(?<=StartDate>)(.*)(?=T00)').Groups[1].Value 
    # Edit the date to replace the - with/
    $prog2 = [System.Text.RegularExpressions.Regex]::Replace($prog,"[-]","/"); 

    if ($prog2) 
    {   
     # Parse the value e.g. 2012/03/23 into a full datetime i.e. 23 March 2012 12:00:00 
     $dt = [datetime]::ParseExact($prog2,"yyyy/MM/dd",$null) 
     # Now string is in datetime format use the -format command to re-order and trim to our desired date 23/03/2012 
     $purchased = Get-Date $dt -Format 'dd/MM/yyyy' 
     # Store all variables in a table with relevant column headings 
     $machines = New-Object PSObject -Property @{Name = $name; Serial = $Serial; User2 = $user2; purchased = $purchased} 
     # Set what the date was 4 years ago today 
     $fourYearsAgo = (Get-Date).AddYears(-4) 
     # Compare our returned date to the date 4 years ago and see if it is less than or equal too i.e. in warranty 
     $tobereplaced = $machines.purchased | Where-Object { (Get-Date $machines.purchased) -le $fourYearsAgo} 

     if ($tobereplaced) 
     {  
      # Parse the date back to a full date/time 
      $dt2 = [datetime]::ParseExact($tobereplaced,"dd/MM/yyyy",$null) 
      # Add 4 years onto the date 
      $replacementdate = (get-date $dt2).AddYears(+4) 
      # Trim it back to our desired format 
      $tbr = Get-Date $replacementdate -Format 'dd/MM/yyyy' 
      # Build our final variable containing our data 
      "EXPIRED" + " " + $name + " " + $user2 + " " + $serial + " " + $tbr; 
     } 
    } 
} 

回答

2

不要将输出保存到变量中,而是输出到管道中。包装你的代码放到一个函数,并收集返回什么的,到一个变量,与此类似:

function abc() 
{ 
    $string1 
    .... #processing block 1 
    $string2 
    .... #processing block 2 
    $string3 
    .... #even more processing. 
} 

如果它是一组字符串,那么你可以加入他们一起寄过来的电子邮件:

$mydata = abc; 
$myEmailBody = $mydata -join "`n"; 
+0

不知道如何将这个应用到上面的代码可以告诉我吗?我的意思是在上面的代码中设置了很多变量,但我只希望从循环中的每条记录返回$ machines2结果返回到函数 – meeeeeeeeee

+0

如果您只想在输出中使用'$ machines2',请将该行替换为“EXPIRED “+”“+ $ name +”“+ $ user2 +”“+ $ serial +”“+ $ tbr'(移除'$ machines2 =')。 – Neolisk