मेरे पास एक मूल स्क्रिप्ट है, जो विंडोज़ सेवाओं को बंद कर देगी और उनकी शटडाउन प्रक्रियाओं के बारे में एक रिपोर्ट तैयार करेगी। मैं अपने आउटपुट वेरिएबल ($table) में दो और कॉलम भी शामिल करना चाहता हूं, जो टाइमस्टैम्प मान होंगे यानी जब शटडाउन कार्य लॉन्च किए गए थे और जब वे समाप्त हो गए थे। मुझे नहीं पता कि इसे अपनी रिपोर्ट में कैसे लागू किया जाए।

$processlist = @('SQLTELEMETRY$TESTDB', 'MSSQL$TESTDB', 'SQLWRITER')
$get = ''
$table = @{ }
$failed = 0


foreach ($proc in $processlist) {
    stop-service -name $proc -force
}

#start-sleep -s 120


foreach ($proc in $processlist) {

    $get = get-service $proc -Erroraction ignore

    if ($get.Status -eq 'Running') {
        $table += @{$proc = 'Running' }
    }
    else {
        $table += @{$proc = 'Stopped' }
    }
}


foreach ($value in $table.GetEnumerator()) {

    if ($value.Value -eq 'Running') {
        $failed += 1
    }
}

if ($failed -gt 0) {
    $err = 'FAILED'
}
else {
    $err = 'SUCCESS'
}

$table.GetEnumerator() | Select-Object -Property Name, Value | export-csv appreport.csv -delimiter ";" -force -notypeinformation

(HTML part here...)
0
lubierzca 22 अगस्त 2019, 16:02

2 जवाब

सबसे बढ़िया उत्तर

हैशटेबल में सामान जोड़ने के बजाय, मुझे लगता है कि वस्तुओं की एक सरणी बनाना और सीएसवी फ़ाइल के रूप में लिखना बहुत आसान होगा।

कुछ इस तरह:

$serviceList = 'SQLTELEMETRY$TESTDB', 'MSSQL$TESTDB', 'SQLWRITER'
$maxAttempts = 10

# $result will become an array of PsCustomObjects you can easily pipe to Export-Csv
$result = foreach ($service in $serviceList) {
    $shutStart = Get-Date
    $svc       = Get-Service -Name $service -ErrorAction SilentlyContinue
    if ($svc) {
        for ($attempt = 0; $attempt -lt $maxAttempts; $attempt++) {
            $shutResult = 'Failed'
            Start-Sleep -Milliseconds 100
            $svc | Stop-Service -Force -ErrorAction SilentlyContinue
            # test if the service has stopped. If so exit the loop
            if (($svc | Get-Service).Status -eq 'Stopped') { 
                $shutResult = 'Success'
                break 
            }
        }
        [PsCustomObject]@{
            'ServiceName'        = $svc.Name
            'ServiceDisplayName' = $svc.DisplayName
            'ShutDownStart'      = $shutStart
            'ShutDownEnd'        = Get-Date
            'Result'             = $shutResult
        }
    }
    else {
        [PsCustomObject]@{
            'ServiceName'        = $service
            'ServiceDisplayName' = ''
            'ShutDownStart'      = $shutStart
            'ShutDownEnd'        = Get-Date
            'Result'             = "Failed: Service '$service' could not be found."
        }
    }
}

# output on screen
$result

# output to CSV
$result | Export-Csv 'D:\appreport.csv' -Delimiter ";" -Force -NoTypeInformation

स्क्रीन पर आउटपुट इस तरह दिखेगा:

ServiceName        : SQLTELEMETRY$TESTDB
ServiceDisplayName : 
ShutDownStart      : 22-8-2019 16:47:40
ShutDownEnd        : 22-8-2019 16:47:40
Result             : Failed: Service 'SQLTELEMETRY$TESTDB' could not be found.

ServiceName        : MSSQL$TESTDB
ServiceDisplayName : 
ShutDownStart      : 22-8-2019 16:47:40
ShutDownEnd        : 22-8-2019 16:47:40
Result             : Failed: Service 'MSSQL$TESTDB' could not be found.

ServiceName        : SQLWRITER
ServiceDisplayName : SQL Server VSS Writer
ShutDownStart      : 22-8-2019 16:47:38
ShutDownEnd        : 22-8-2019 16:47:39
Result             : Success

उम्मीद है की वो मदद करदे

1
Theo 22 अगस्त 2019, 17:53

मैं वास्तव में नहीं जानता कि आप सेवाओं के लिए टाइम स्टैंप कब कैप्चर करना चाहते हैं, लेकिन मेरा सुझाव है कि आप नीचे दी गई संपत्ति का लाभ उठाएं और इसे उस लूप में जोड़ें जहां आप इसे उपयुक्त समझते हैं।

(Get-Process -Name $proc).StartTime

इसके अलावा आप नीचे दिए गए गुणों का उपयोग कर सकते हैं:

  • यूजरप्रोसेसरटाइम
  • कुल प्रक्रिया समय
  • बाहर निकलने का समय

मुझे उम्मीद है कि इससे आपको समय पर कब्जा करने में मदद मिलेगी।

0
Mahmood Shehab 22 अगस्त 2019, 18:39