2011-03-04 6 views
5

मैं निष्पादन योग्य फ़ाइलों के प्रदर्शन का मूल्यांकन करने के लिए Windows PowerShell पर एक साधारण स्क्रिप्ट लिख रहा हूं।निष्पादन योग्य फ़ाइलों के प्रदर्शन का मूल्यांकन करने के लिए WIndows PowerShell 1.0 या 2.0 का उपयोग

महत्वपूर्ण परिकल्पना निम्नलिखित है: मेरे पास एक निष्पादन योग्य फ़ाइल है, यह किसी भी संभावित भाषा (.net और नहीं, Viual-Prolog, C++, C, में लिखा गया एक एप्लीकेशन हो सकता है जिसे .exe फ़ाइल के रूप में संकलित किया जा सकता है)। मैं इसे निष्पादन के समय प्राप्त करना चाहता हूं।

Function Time-It { 
    Param ([string]$ProgramPath, [string]$Arguments) 
    $Watch = New-Object System.Diagnostics.Stopwatch 
    $NsecPerTick = (1000 * 1000 * 1000)/[System.Diagnostics.Stopwatch]::Frequency 
    Write-Output "Stopwatch created! NSecPerTick = $NsecPerTick" 
    $Watch.Start() # Starts the timer 
    [System.Diagnostics.Process]::Start($ProgramPath, $Arguments) 
    $Watch.Stop() # Stops the timer 
    # Collectiong timings 
    $Ticks = $Watch.ElapsedTicks 
    $NSecs = $Watch.ElapsedTicks * $NsecPerTick 
    Write-Output "Program executed: time is: $Nsecs ns ($Ticks ticks)" 
} 

इस समारोह स्टॉपवॉच का उपयोग करता है:

मैं ऐसा किया। ठीक है, functoin एक प्रोग्राम पथ स्वीकार करता है, स्टॉपवॉच शुरू होता है, प्रोग्राम चलाया जाता है और स्टॉपवॉच बंद हो जाता है। समस्या: System.Diagnostics.Process.Start असीमित है और अगला निर्देश (घड़ी बंद) निष्पादित नहीं होता है जब एप्लिकेशन समाप्त होता है। एक नई प्रक्रिया बनाई गई है ...

प्रोग्राम समाप्त होने के बाद मुझे टाइमर को रोकने की आवश्यकता है।

मैं Process वर्ग के बारे में सोचा है, यह कुछ निष्पादन समय ... भाग्यशाली नहीं के बारे में जानकारी का आयोजन किया thicking ...

इस हल करने के लिए कैसे?

उत्तर

6

आप का उपयोग Process.WaitForExit()

$proc = new-object "System.Diagnostics.Process" 
$proc.StartInfo.FileName = "notepad.exe" 
$proc.StartInfo.UseShellExecute = $false 
$proc.Start() 
$proc.WaitForExit() 
+0

लेकिन यह स्थिर नहीं है ... मैं एक प्रक्रिया वस्तु बनाने चाहिए, लेकिन वास्तव में समझ में नहीं आता कि निष्पादन योग्य पथ कैसे सेट करें ... – Andry

+0

'$ proc = new-object" System.Diagnostics.Process "' और फिर केवल गुण सेट करें। आप .NET दस्तावेज़ों का पालन कर सकते हैं, कक्षाएं वही काम करती हैं, जाहिर है। – kprobst

+0

@Andry - मैंने एक नमूना जोड़ा। – kprobst

2

यहाँ kprobst's answer,, Measure-Command cmdlet के साथ संयुक्त एक पूर्ण समाधान के लिए है कर सकते हैं:

$proc = new-object "System.Diagnostics.Process" 
$proc.StartInfo.FileName = "notepad.exe" 
$proc.StartInfo.UseShellExecute = $false 
$timeSpan = (MeasureCommand { 
           $proc.Start() 
           $proc.WaitForExit() 
          } 
      ); 
"Program executed: Time is {0} seconds" -f $timeSpan.TotalSeconds; 
संबंधित मुद्दे

 संबंधित मुद्दे