Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 点源脚本在第二次运行时未引用当前目录_Powershell_Command Prompt - Fatal编程技术网

Powershell 点源脚本在第二次运行时未引用当前目录

Powershell 点源脚本在第二次运行时未引用当前目录,powershell,command-prompt,Powershell,Command Prompt,我有一个脚本,在下面,我有一个脚本文件夹。它引用一组命令提示符应用程序$cmd1.exe等。。在VS代码中使用Powershell或集成Powershell终端,我将按照以下步骤使用它: 点从脚本目录>中获取脚本的源代码。\new customconfig.ps1 更改到工作目录>cd[新目录] 使用脚本中的函数并从工作目录传递文件名>New CustomConfig。\filename 在我第一次运行脚本时,它会从工作目录中传递该文件,但在任何后续运行中,它都会在脚本目录中查找该文件 我做错什

我有一个脚本,在下面,我有一个脚本文件夹。它引用一组命令提示符应用程序
$cmd1.exe等。
。在VS代码中使用Powershell或集成Powershell终端,我将按照以下步骤使用它:

  • 点从脚本目录
    >中获取脚本的源代码。\new customconfig.ps1
  • 更改到工作目录
    >cd[新目录]
  • 使用脚本中的函数并从工作目录传递文件名
    >New CustomConfig。\filename
  • 在我第一次运行脚本时,它会从工作目录中传递该文件,但在任何后续运行中,它都会在脚本目录中查找该文件

    我做错什么了吗

    Function New-CustomConfig {
        [CmdletBinding()]
        Param(
            [Parameter(Mandatory=$true)]
            [string]
            $FileName
        )
    
        Begin {
            #Set tools directory
            $ToolD = '[Directory]\Tools'
    
            #Clean up filename
            $FileName = $FileName -replace '^[\W]*', ''
    
            #Setup Executables
            $cmdtools = "\cmd1.exe", "\cmd2.exe", "\cmd3.exe"
    
            #Setup Arguments
            $cmdargs = "cmd1args", "cmd2args", "cmd3args"
    
            #Setup Write-Host Comments
            $cmdecho = "echo1", "echo2", "echo3"
    
            #Setup command object info
            $cmdinfo = New-Object System.Diagnostics.ProcessStartInfo
            $cmdinfo.RedirectStandardError = $true
            $cmdinfo.RedirectStandardOutput = $true
            $cmdinfo.UseShellExecute = $false
    
            #Create command object
            $cmd = New-Object System.Diagnostics.Process
    
            "Generating Config for $FileName"
        }
    
        Process {
            for ($i = 0; $i -le $cmdtools.Count; $i++) {
                $cmdinfo.FileName = $ToolD + $cmdtools[$i]
                $cmdinfo.Arguments = '' + $cmdargs[$i] + ''
                Write-Host $i
                Write-Host $cmdinfo.FileName
                Write-Host $cmdinfo.Arguments
                Write-Host $(Get-Location)
    
                $cmdecho[$i]
    
                $cmd.StartInfo = $cmdinfo
                $cmd.Start() | Out-Null
                $cmd.WaitForExit()
    
                $stdout = $cmd.StandardOutput.ReadToEnd()
                $stderr = $cmd.StandardError.ReadToEnd()
    
                Write-Host "stdout: $stdout"
                Write-Host "stderr: $stderr"
                Write-Host "exit code: " + $p.ExitCode
            }
        }
    
        End {
            "Press any key to continue..."
            $null = $host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
        }
    
    }
    

    PowerShell的当前位置与进程的工作目录不同。和
    cd
    仅更改当前位置,不更改工作目录。另外
    $stdout=$cmd.StandardOutput.ReadToEnd()$stderr=$cmd.StandardError.ReadToEnd()
    请求死锁。谢谢!我通过将
    $cmdinfo.WorkingDirectory
    属性设置为
    $(获取位置)
    解决了这个问题。对于潜在的死锁,我通过使用字符串生成器异步读取stdout和stderr来解决它:
    $stdOutBld=New Object-TypeName System.Text.StringBuilder
    $eventChk={if(![string]::IsNullOrEmpty($EventArgs.Data)){$Event.MessageData.AppendLine($EventArgs.Data)
    $stdOutEvt=Register ObjectEvent-InputObject$cmd-Action$eventChk-EventName'OutputDataReceived'-MessageData$stdOutBld
    $cmd.BeginOutputReadLine()