पॉवरशेल फ़ंक्शन फ़ंक्शन का पता लगाएँ पुनर्निर्देशित किया गया है


1

मेरे पास एक सबप्रोसेस है जिसे मैं पावरशेल से कॉल करना चाहता हूं जो इंटरएक्टिव हो सकता है या मैं इसमें सीधे डेटा पाइप कर सकता हूं। उदाहरण के लिए:

# This is interactive:
& c:\python27\python.exe

# This takes redirected input:
echo hi | & c:\python27\python.exe -c "print repr(raw_input())"

मैं एक फ़ंक्शन बनाना चाहता हूं जिसका उपयोग ऐसी प्रक्रिया को कॉल लपेटने के लिए किया जा सकता है। मे यह कर सकती हु:

function python() {
    & c:\python27\python.exe @args
}

# This starts an interactive prompt:
python

# The piped data disappears and the process still reads from the console:
echo hi | python -c "print repr(raw_input())"

या मैं यह कर सकता हूं:

function python() {
    $input | & c:\python27\python.exe @args
}

# This doesn't accept interactive input:
python

# The piped data is passed through to the sub-process as intended:
echo hi | python -c "print repr(raw_input())"

मैं यह नहीं जान सकता कि दोनों मामलों को संभालने वाले फ़ंक्शन को कैसे लिखा जाए। यदि इसे बिना पाइपलाइन के लगाया जाता है, तो मैं चाहता हूं कि यह एक सबप्रोसेस शुरू करे जो स्टड से पढ़ता है, और अगर यह एक पाइपलाइन इनपुट के साथ है, तो मैं चाहता हूं कि इसे सबप्रोसेस के स्टिन में फीड करें। क्या मैं यह कर सकता हूं?

जवाबों:


2

आप यह $MyInvocation.ExpectingInputपता लगाने के लिए अभिव्यक्ति के मूल्य की जांच कर सकते हैं कि आपके फ़ंक्शन ने किसी पाइपलाइन इनपुट की अपेक्षा की है या यह पाइपलाइन का पहला तत्व है।

function python {
    if($MyInvocation.ExpectingInput){
        $input | & c:\python27\python.exe @args
    }else{
        & c:\python27\python.exe @args
    }
}

1

फ़ंक्शन में पैरामीटर को परिभाषित करें, जो आपके डेटा को रखेगा। फिर जाँच करें कि क्या पैरामीटर की आपूर्ति की गई है और तदनुसार कार्य करें। जिस तरह से PowerShell बाहरी कार्यक्रमों के लिए डेटा पारित करता है , लेकिन मूल विचार खड़ा होने के कारण आपको कुछ ट्विक करना पड़ सकता है ।

बेयरबोन उदाहरण:

उपयोग:

'foo', '', 'bar' | Invoke-Python

यहाँ मैं Invoke-Pythonफ़ंक्शन के लिए एक सरणी पास कर रहा हूं ।

परिणाम:

  • अजगर को 'फू' पाइप किया जाएगा
  • फिर, फ़ंक्शन रिक्त पैरामीटर का सामना करेगा और इंटरैक्टिव अजगर को आमंत्रित करेगा
  • इंटरेक्टिव पाइथन से बाहर निकलने के बाद, फंक्शन अजगर को 'बार' देगा

Invoke-Python समारोह:

function Invoke-Python
{
    [CmdletBinding()]
    Param
    (
        # This parameter will catch your input data
        [Parameter(ValueFromPipeline = $true)]
        [string]$InputObject
    )

    # This block runs when pipeline is initialized.
    # It doesn't have access to the parameters,
    # they are not yet parsed at this time.
    Begin
    {
        # Set path to the python
        $PythonPath = 'c:\python27\python.exe'
    }

    # This block runs for each pipeline item
    Process
    {
        # Check, is there anything passed in the InputObject parameter
        if($InputObject)
        {
            Write-Host 'We have some data, let''s pipe it into the python'
            $InputObject | & $PythonPath @('-c', 'print repr(raw_input())')
        }
        else
        {
            Write-Host 'No data, let''s just launch interactive python'
            & $PythonPath
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.