2010-05-25 10 views
5

का उपयोग करते समय प्राप्त नहीं किया गया है Power.hell.exe पर पाइप इनपुट पढ़ने के लिए .NET [Console]::ReadLine() पर कॉल करते समय मुझे डेटा हानि मिल रही है। अध्यक्ष एवं प्रबंध निदेशक में, चलाएँ:PowerShell.exe को पाइप किए गए पाठ को [कंसोल] :: रीडलाइन()

 
>ping localhost | powershell -NonInteractive -NoProfile -C "do {$line = [Console]::ReadLine(); ('' + (Get-Date -f 'HH:mm 
:ss') + $line) | Write-Host; } while ($line -ne $null)" 
23:56:45time<1ms 
23:56:45 
23:56:46time<1ms 
23:56:46 
23:56:47time<1ms 
23:56:47 
23:56:47 

Vista64 से आम तौर पर 'पिंग स्थानीय होस्ट' इस तरह दिखता है, इसलिए वहाँ ऊपर उत्पादन से लापता डेटा का एक बहुत है:

 

Pinging WORLNTEC02.bnysecurities.corp.local [::1] from ::1 with 32 bytes of data: 
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 

Ping statistics for ::1: 
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 0ms, Maximum = 0ms, Average = 0ms 

लेकिन सी # से एक ही एपीआई का उपयोग कर प्रक्रिया में भेजे गए सभी डेटा प्राप्त करता है (कुछ न्यूलाइन मतभेदों को छोड़कर)। कोड:

namespace ConOutTime { 
    class Program { 
     static void Main (string[] args) { 
      string s; 
      while ((s = Console.ReadLine()) != null) { 
       if (s.Length > 0) // don't write time for empty lines 
        Console.WriteLine("{0:HH:mm:ss} {1}", DateTime.Now, s); 
      } 
     } 
    } 
} 

आउटपुट:

 
00:44:30 Pinging WORLNTEC02.bnysecurities.corp.local [::1] from ::1 with 32 bytes of data: 
00:44:30 Reply from ::1: time<1ms 
00:44:31 Reply from ::1: time<1ms 
00:44:32 Reply from ::1: time<1ms 
00:44:33 Reply from ::1: time<1ms 
00:44:33 Ping statistics for ::1: 
00:44:33  Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 
00:44:33 Approximate round trip times in milli-seconds: 
00:44:33  Minimum = 0ms, Maximum = 0ms, Average = 0ms 

तो, 'खाया' हो सी # stdin के कई हिस्सों के बजाय PowerShell से एक ही एपीआई बुला सकते हैं। क्या PowerShell StdIn से स्ट्रिंग स्ट्रिंग होस्ट करता है भले ही मैंने 'PowerShell.exe -Command -' का उपयोग नहीं किया है?

+0

मैं एक त्रुटि मिली समाप्त हो गया PowerShell के तहत इस। अपने प्रश्न फिक्सिंग सीएमडी निर्दिष्ट करने के लिए। आपके प्रश्नों अच्छा विस्तार से भरा हुआ है (धन्यवाद!), लेकिन आप एक छोटे से 'Get-Date' बिट को हटाने के द्वारा सरल बातें ahve नहीं कर सकता है? –

+0

मुझे लगता है कि परिणामों की पुष्टि अस्थायी/अविश्वसनीय हैं। यह गति-आधारित प्रतीत होता है। यदि 'पिंग' को कुछ तेज़ी से बदल दिया गया है (' foo.txt' टाइप करें), तो मुझे कोई आउटपुट नहीं मिलता है। अगर मैं कुछ धीमा ('कॉपी कॉन') का उपयोग करता हूं तो मुझे सबकुछ मिलता है –

+0

@JayBazuzi टाइमस्टैम्प-प्रति-लाइन एकमात्र कारण था जिसे मैं पहली जगह पावरहेल के माध्यम से पाइप कर रहा था। ;) – yzorg

उत्तर

5

आप कार्यक्रम में पहुंचाया डेटा तक पहुँच प्राप्त करने के लिए PowerShell में $input प्रगणक उपयोग कर सकते हैं। मैंने यह भी पाया है कि [Console]::ReadLine() किसी भी तरह से कुछ भी नहीं करता है। इसके लिए अज्ञात कारण, हालांकि।

C:\Users\Me> ping localhost | powershell -noninteractive -noprofile -c "$input|%{(date -f HH:mm:ss)+' '+$_}" 

07:31:54 
07:31:54 Pinging Sigmund [::1] with 32 bytes of data: 
07:31:54 Reply from ::1: time<1ms 
07:31:54 Reply from ::1: time<1ms 
07:31:54 Reply from ::1: time<1ms 
07:31:55 Reply from ::1: time<1ms 
07:31:55 
07:31:55 Ping statistics for ::1: 
07:31:55  Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 
07:31:55 Approximate round trip times in milli-seconds: 
07:31:55  Minimum = 0ms, Maximum = 0ms, Average = 0ms 

C:\Users\Me>ping localhost 

Pinging Sigmund [::1] with 32 bytes of data: 
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 

Ping statistics for ::1: 
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 0ms, Maximum = 0ms, Average = 0ms 
+0

$ इनपुट के साथ अच्छी चाल। पता नहीं था कि इस तरह इसका उपयोग करना संभव है जब "पाइपलाइन पावरहेल प्रक्रिया से बाहर है"। – stej

+0

@stej: मुझे कोई अन्य विश्वसनीय तरीका नहीं पता है। और यह कोड-गोल्फिंग के लिए भयानक है क्योंकि आप केवल '@ ($ इनपुट)' के साथ इनपुट लाइनों की एक सरणी प्राप्त कर सकते हैं लेकिन आवश्यकता होने पर लाइन-वार नहीं पढ़ सकते हैं :-( – Joey

+0

@ जॉय यह हेक्स रूपांतरण के साथ काम नहीं कर रहा है, उदाहरण ' '{0: एक्स}' -f $ input' आप अद्यतन कर सकता हूँ –

1

एक संभव समाधान इस एक है:

powershell -NonInteractive -NoProfile -C "ping localhost | % { ('' + (Get-Date -f 'HH:mm:ss') + $_) | Write-Host; }" 

मैं अन्य सवाल दर्शकों के लिए इसे जोड़ने रहा हूँ, कारण मुझे लगता है कि आप कुछ कारणों के लिए किया था तुम क्यों उपयोग नहीं करते हैं :)

0

मैं अपना अंतिम समाधान सबमिट कर रहा हूं, भले ही यह वास्तव में मेरे प्रारंभिक प्रश्न का उत्तर न हो। मैं एक cmd.exe पर्यावरण से शक्तियों को डेटा पाइप करने की कोशिश कर रहा था जिसमें विशेष उपकरण का एक समूह था (www.streambase.com देखें)। आखिरकार मैंने अपने पावरहेल पर्यावरण में उपकरण जोड़े। "एक अभिव्यक्ति '(' के बाद उम्मीद थी।" अगर मैं चलाएँ:

मैं PowerShell और बाहर समय उन्नत कार्य करने के लिए पाइपिंग के भीतर से बाहरी उपकरण बुला ...

function Out-Time { 
param (
    [parameter(ValueFromPipeline=$true)] 
    $Value, 
    [switch] $OutputEmptyLines=$false) 
process { 
    if (!$OutputEmptyLines -and ($Value -eq $null -or $Value -eq '')) { 
    } 
    else { 
     "{0} {1}" -f @((get-date -Format "HH:mm:ss.ff"), $Value) 
    } 
} 
} 
#test 
#ping localhost | Out-Time; ping localhost | Out-Time -OutputEmpty 
संबंधित मुद्दे