用于将输出添加到变量的PowerShell脚本

时间:2012-10-23 15:37:20

标签: powershell

我有以下脚本,但我需要替换Write-Host并将输出存储在单个变量中而不是写入输出。

我希望在一个变量中输出所有输出,然后我可以通过电子邮件发送内容。

循环结束时的

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 results 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 information about a Dell system from a service tag from the 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;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

不要将输出保存到变量,而是输出到管道。将代码包装到函数中并将返回的内容收集到变量中,类似于:

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

如果是一组字符串,您可以将它们连接在一起并通过电子邮件发送:

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