जोसेफज का जवाब अपने मुद्दे को पूरी तरह से समझाता है। आप regex का उपयोग कर रहे हैं और यह वही कर रहा है जो आप इसे करने के लिए कह रहे हैं कि शायद आप अपनी अपेक्षा से अधिक की जगह लें।
एक साइड नोट यह है कि आप पूछ रहे हैं netstat सेवा मेरे
प्रत्येक कनेक्शन या श्रवण पोर्ट बनाने में शामिल निष्पादन योग्य प्रदर्शित करता है
बी स्विच के साथ। हालाँकि आप इसे छोड़ रहे हैं select-string चूँकि वह प्रक्रिया दूसरे डेटा के बाद अपनी लाइन पर दिखाई देती है। यह दुनिया का अंत नहीं है, लेकिन क्योंकि आप चीजों का उपयोग कर सकते हैं -Context का Select-String उसे पाने के लिए लेकिन उस समय को और करीब से देखना होगा।
मैं अन्य सुझाव देना चाहूंगा कि इस स्थिति में आप क्या कर सकते हैं।
अन्य उपकरणों का उपयोग करना दुर्भाग्य से संभव नहीं है इसलिए मैं अंतर्निहित विंडोज टूल का उपयोग करने के लिए सीमित हूं।
उस बारे में मजेदार बात, क्या आपके पास कम से कम विंडोज 8 है? यदि आप करते हैं तो आप बस का उपयोग कर सकते हैं Get-NetTCPConnection cmdlet जो अनिवार्य रूप से है netstat वस्तु रूप में।
तो आप ऐसा कर सकते हैं जो आपको परेशानी के बिना एक ही जानकारी मिलनी चाहिए
get-nettcpconnection | select local*,remote*,state,@{Name="Process";Expression={(Get-Process -Id $_.OwningProcess).ProcessName}}
विंडोज 8+ नहीं है? ठीक है तो हम आपकी पार्सिंग स्क्रिप्ट पर सुधार कर सकते हैं। ऑब्जेक्ट बनाने के लिए इसे एक कदम आगे ले जाने से रेगेक्स मिलान के साथ समस्या को रोका जा सकेगा।
netstat -ano | Where-Object{$_ -match 'LISTENING|UDP'} | ForEach-Object{
$split = $_.Trim() -split "\s+"
[pscustomobject][ordered]@{
"Proto" = $split[0]
"Local Address" = $split[1]
"Foreign Address" = $split[2]
# Some might not have a state. Check to see if the last element is a number. If it is ignore it
"State" = if($split[3] -notmatch "\d+"){$split[3]}else{""}
# The last element in every case will be a PID
"Process Name" = $(Get-Process -Id $split[-1]).ProcessName
}
}
यदि आप PowerShell v2 तक सीमित थे, तो आपको psobject को बदलने और कलाकारों का आदेश देने की आवश्यकता होगी
netstat -ano | Where-Object{$_ -match 'LISTENING|UDP'} | ForEach-Object{
$split = $_.Trim() -split "\s+"
New-Object -Type pscustomobject -Property @{
"Proto" = $split[0]
"Local Address" = $split[1]
"Foreign Address" = $split[2]
# Some might not have a state. Check to see if the last element is a number. If it is ignore it
"State" = if($split[3] -notmatch "\d+"){$split[3]}else{""}
# The last element in every case will be a PID
"Process Name" = $(Get-Process -Id $split[-1]).ProcessName
}
} | Select "Proto", "Local Address", "Foreign Address", "State", "Process Name"
अंतिम select कथन संपत्ति के आदेश की गारंटी देता है, जिसे अन्यथा फेरबदल किया जाएगा, और यह कार्यात्मक समकक्ष है [ordered]
ताकि आप इस तरह से आउटपुट करेंगे ...
Proto Local Address Foreign Address State Process Name
----- ------------- --------------- ----- ------------
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING svchost
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING System
TCP 0.0.0.0:1279 0.0.0.0:0 LISTENING PlexDlnaServer
TCP 0.0.0.0:2869 0.0.0.0:0 LISTENING System
तब आप ऐसा व्यवहार कर सकते हैं जैसे आप किसी भी PowerShell ऑब्जेक्ट और फ़िल्टर करते हैं जैसा कि आप CSV या आपको जो कुछ भी करने की आवश्यकता है, वह फिट या आउटपुट दिखाई देता है। यह अब संरचित है।
अपने PowerShell संस्करण के आधार पर आप उपयोग भी कर सकते हैं Convert-FromString जो सिंगल लाइन स्ट्रिंग्स लेता है और उन्हें ऑब्जेक्ट्स में भी परिवर्तित करता है। ऊपर देखने के लिए कुछ और।
netstat -bano|select-string 'LISTENING|UDP'