【问题标题】:Powershell Script Start-Process is not workingPowershell Script Start-Process 不工作
【发布时间】:2018-06-15 18:58:22
【问题描述】:

我的脚本有问题,我找不到解决方案。当我尝试运行这个脚本时,它总是说:

Cmdlet Start-Process an der Befehlspipelineposition 1 Geben Sie Werte für die folgenden 参数 an: 文件路径:

这是什么意思? 我知道我在 Powershell 方面不是很好,去年夏天才开始编写脚本。 所以看起来可能有点丑……

这是我的脚本,希望有人能帮助我:

function Task_S{

    #starting 'task_s.ps1'
    $thisScriptDirectoryPath = Split-Path -parent 
    $MyInvocation.MyCommand.Definition
    $utilityScriptName = "..\Start_and_furthers\task_s.ps1"
    $utilityScript = (Join-Path $thisScriptDirectoryPath $utilityScriptName)
    $result = .$utilityScript
}

function Task_D{

    #starting 'task_d.ps1
    $thisScriptDirectoryPath = Split-Path -parent 
    $MyInvocation.MyCommand.Definition
    $utilityScriptName = "task_d.ps1"
    $utilityScript = (Join-Path $thisScriptDirectoryPath $utilityScriptName)
    $result = . $utilityScript
}

function Task_I{

    #starting 'task_i.ps1
    $thisScriptDirectoryPath = Split-Path -parent 
    $MyInvocation.MyCommand.Definition
    $utilityScriptName = "task_i.ps1"
    $utilityScript = (Join-Path $thisScriptDirectoryPath $utilityScriptName)
    $result = . $utilityScript
}

function Task_T{

    #starting 'task_t.ps1
    $thisScriptDirectoryPath = Split-Path -parent 
    $MyInvocation.MyCommand.Definition
    $utilityScriptName = "task_t.ps1"
    $utilityScript = (Join-Path $thisScriptDirectoryPath $utilityScriptName)
    $result = . $utilityScript
}

function Choicebuttons{

    function Window {

        # Add Window
        $Form = New-Object System.Windows.Forms.Form
        $Form.Text = "Exercises"
        $Form.Size = New-Object System.Drawing.Size(200,200)
        $Form.Topmost = $True
    }

    function Buttons {

        # Add Button for S
        $Button_S = New-Object System.Windows.Forms.Button
        $Button_S.Location = New-Object System.Drawing.Size(40,30)
        $Button_S.Size = New-Object System.Drawing.Size(120,30)
        $Button_S.Text = "S: "

        # Add Button for D
        $Button_D = New-Object System.Windows.Forms.Button
        $Button_D.Location = New-Object System.Drawing.Size(40,100)
        $Button_D.Size = New-Object System.Drawing.Size(120,30)
        $Button_D.Text = "D:"

        # Add Button for I
        $Button_I = New-Object System.Windows.Forms.Button
        $Button_I.Location = New-Object System.Drawing.Size(40,100)
        $Button_I.Size = New-Object System.Drawing.Size(120,30)
        $Button_I.Text = "I:"

        # Add Button for T
        $Button_T = New-Object System.Windows.Forms.Button
        $Button_T.Location = New-Object System.Drawing.Size(40,100)
        $Button_T.Size = New-Object System.Drawing.Size(120,30)
        $Button_T.Text = "T:"
    }

    function Labels {

        # Add Label for S
        $Label_S = New-Object System.Windows.Forms.Label
        $Label_S.Location = New-Object System.Drawing.Size(40,30)
        $Label_S.Text = "Strukturen suchen und dokumentieren mit Struktogramm"

        # Add Label for D
        $Label_D = New-Object System.Windows.Forms.Label
        $Label_D.Location = New-Object System.Drawing.Size(40,30)
        $Label_D.Text = "Datentypen anwenden und dokumentieren"

        # Add Label for I
        $Label_I = New-Object System.Windows.Forms.Label
        $Label_I.Location = New-Object System.Drawing.Size(40,30)
        $Label_I.Text = "Ablaufstruktur umsetzen & Quellcode ausarbeiten"

        # Add Label for T
        $Label_T = New-Object System.Windows.Forms.Label
        $Label_T.Location = New-Object System.Drawing.Size(40,30)
        $Label_T.Text = "Debuggen & Testen"
    }

    function AddForms {

        # Add Buttons and Labels to Window
        $Form.Controls.Add($Button_S)
        $Form.Controls.Add($Button_D)
        $Form.Controls.Add($Button_I)
        $Form.Controls.Add($Button_T)
        $Form.Controls.Add($Label_S)
        $Form.Controls.Add($Label_D)
        $Form.Controls.Add($Label_I)
        $Form.Controls.Add($Label_T)
    }

    function ButtonEvent {

        #Add Button event 
        $Button_S.Add_Click({Task_D})
        $Button_D.Add_Click({Task_D})
        $Button_I.Add_Click({Task_I})
        $Button_T.Add_Click({Task_T})
    }

    # Starting for Window
    Add-Type -AssemblyName System.Windows.Forms    
    Add-Type -AssemblyName System.Drawing

    # Loading Functions & Inserts
    Window
    Buttons
    Labels
    Addforms
    Buttonevent

    #Show the Form 
    $form.ShowDialog()| Out-Null
 }

Choicebuttons

【问题讨论】:

  • 我在这个脚本中没有看到“start-process”。它是否来自它正在使用的其他脚本之一?
  • 这就是问题所在,Write-Host "hi" 的其他脚本中没有任何内容。

标签: powershell cmdlets start-process


【解决方案1】:

你可以试试这个吗?

$ps = new-object System.Diagnostics.Process
$ps.StartInfo.Filename = $utilityScript
$ps.StartInfo.RedirectStandardOutput = $True
$ps.StartInfo.UseShellExecute = $false
$ps.start()
$ps.WaitForExit()
$result = $ps.StandardOutput.ReadToEnd();

我建议你把它做成一个函数,这样你就可以多次调用它。像这样:

function RunProcessWithOutput($fileName)
{
$ps = new-object System.Diagnostics.Process
$ps.StartInfo.Filename = $fileName
$ps.StartInfo.RedirectStandardOutput = $True
$ps.StartInfo.UseShellExecute = $false
$ps.start()
$ps.WaitForExit()
return $ps.StandardOutput.ReadToEnd();
}

然后这样调用

$result = RunProcessWithOutput $utilityScript

这就是结果

function RunProcessWithOutput($fileName)
{
$ps = new-object System.Diagnostics.Process
$ps.StartInfo.Filename = $fileName
$ps.StartInfo.RedirectStandardOutput = $True
$ps.StartInfo.UseShellExecute = $false
$ps.start()
$ps.WaitForExit()
return $ps.StandardOutput.ReadToEnd();
}

function Task_S{

    #starting 'task_s.ps1'
    $thisScriptDirectoryPath = Split-Path -parent 
    $MyInvocation.MyCommand.Definition
    $utilityScriptName = "..\Start_and_furthers\task_s.ps1"
    $utilityScript = (Join-Path $thisScriptDirectoryPath $utilityScriptName)
    $result = RunProcessWithOutput $utilityScript
}

function Task_D{

    #starting 'task_d.ps1
    $thisScriptDirectoryPath = Split-Path -parent 
    $MyInvocation.MyCommand.Definition
    $utilityScriptName = "task_d.ps1"
    $utilityScript = (Join-Path $thisScriptDirectoryPath $utilityScriptName)
    $result = . $utilityScript
}

function Task_I{

    #starting 'task_i.ps1
    $thisScriptDirectoryPath = Split-Path -parent 
    $MyInvocation.MyCommand.Definition
    $utilityScriptName = "task_i.ps1"
    $utilityScript = (Join-Path $thisScriptDirectoryPath $utilityScriptName)
    $result = . $utilityScript
}

function Task_T{

    #starting 'task_t.ps1
    $thisScriptDirectoryPath = Split-Path -parent 
    $MyInvocation.MyCommand.Definition
    $utilityScriptName = "task_t.ps1"
    $utilityScript = (Join-Path $thisScriptDirectoryPath $utilityScriptName)
    $result = . $utilityScript
}

function Choicebuttons{

    function Window {

        # Add Window
        $Form = New-Object System.Windows.Forms.Form
        $Form.Text = "Exercises"
        $Form.Size = New-Object System.Drawing.Size(200,200)
        $Form.Topmost = $True
    }

    function Buttons {

        # Add Button for S
        $Button_S = New-Object System.Windows.Forms.Button
        $Button_S.Location = New-Object System.Drawing.Size(40,30)
        $Button_S.Size = New-Object System.Drawing.Size(120,30)
        $Button_S.Text = "S: "

        # Add Button for D
        $Button_D = New-Object System.Windows.Forms.Button
        $Button_D.Location = New-Object System.Drawing.Size(40,100)
        $Button_D.Size = New-Object System.Drawing.Size(120,30)
        $Button_D.Text = "D:"

        # Add Button for I
        $Button_I = New-Object System.Windows.Forms.Button
        $Button_I.Location = New-Object System.Drawing.Size(40,100)
        $Button_I.Size = New-Object System.Drawing.Size(120,30)
        $Button_I.Text = "I:"

        # Add Button for T
        $Button_T = New-Object System.Windows.Forms.Button
        $Button_T.Location = New-Object System.Drawing.Size(40,100)
        $Button_T.Size = New-Object System.Drawing.Size(120,30)
        $Button_T.Text = "T:"
    }

    function Labels {

        # Add Label for S
        $Label_S = New-Object System.Windows.Forms.Label
        $Label_S.Location = New-Object System.Drawing.Size(40,30)
        $Label_S.Text = "Strukturen suchen und dokumentieren mit Struktogramm"

        # Add Label for D
        $Label_D = New-Object System.Windows.Forms.Label
        $Label_D.Location = New-Object System.Drawing.Size(40,30)
        $Label_D.Text = "Datentypen anwenden und dokumentieren"

        # Add Label for I
        $Label_I = New-Object System.Windows.Forms.Label
        $Label_I.Location = New-Object System.Drawing.Size(40,30)
        $Label_I.Text = "Ablaufstruktur umsetzen & Quellcode ausarbeiten"

        # Add Label for T
        $Label_T = New-Object System.Windows.Forms.Label
        $Label_T.Location = New-Object System.Drawing.Size(40,30)
        $Label_T.Text = "Debuggen & Testen"
    }

    function AddForms {

        # Add Buttons and Labels to Window
        $Form.Controls.Add($Button_S)
        $Form.Controls.Add($Button_D)
        $Form.Controls.Add($Button_I)
        $Form.Controls.Add($Button_T)
        $Form.Controls.Add($Label_S)
        $Form.Controls.Add($Label_D)
        $Form.Controls.Add($Label_I)
        $Form.Controls.Add($Label_T)
    }

    function ButtonEvent {

        #Add Button event 
        $Button_S.Add_Click({Task_D})
        $Button_D.Add_Click({Task_D})
        $Button_I.Add_Click({Task_I})
        $Button_T.Add_Click({Task_T})
    }

    # Starting for Window
    Add-Type -AssemblyName System.Windows.Forms    
    Add-Type -AssemblyName System.Drawing

    # Loading Functions & Inserts
    Window
    Buttons
    Labels
    Addforms
    Buttonevent

    #Show the Form 
    $form.ShowDialog()| Out-Null
 }

【讨论】:

  • 你确定StandardOutput.ReadToEnd()WaitForExit()之后?
  • 如果进程输出大量输出,比如 100 KB 或更多,它不会死锁吗?
  • 他是 ps 新手,我不想让脚本过于复杂,我知道(并且在我之前处理过),但大多数高管没有这个问题。跨度>
  • Ctznkane525 谢谢你,但我不知道我必须把结果放在哪里。是否可以像我一样在按钮中执行此操作?你能把包含新部分的整个脚本发给我吗?那太好了。
  • 我加了,试试看,让我知道
【解决方案2】:

我想我喜欢这个解决方案。我只是更改了任务的功能,因此它采用 PS 的路径。所以现在看起来像这样:

$utilityScriptName = "..\start2.ps1"
$utilityScript = (Join-Path $PSCommandpath $utilityScriptName)
$result = .$utilityScript

这很好用,但我不知道这是否也适用于其他脚本。谢谢你的帮助

【讨论】:

  • 现在我必须弄清楚为什么脚本不工作。第 98-105、111-114 和 129 行似乎有一个错误。它总是说以下句子:Esist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat。在 C:\Users\User\Desktop\Skripts\Start_and_furthers\start2.ps1:112 Zeichen:13 + $Button_D.Add_Click({Task_D}) + ~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull
猜你喜欢
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
相关资源
最近更新 更多