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()