执行远程PowerShell脚本时出现错误。 在本地机器上,我正在运行PowerShell脚本,该脚本使用Invoke-Command来切换到远程Amazon Windows Server实例上的目录,并使用后续的Invoke-Command来执行位于该服务器实例上的脚本。 服务器上的脚本试图从GitHub克隆一个存储库。 我可以成功地在服务器脚本中做“ls”甚至是“git –version”。 然而, git clone , git pull等会导致以下错误:
克隆到'MyRepo'中… + CategoryInfo:NotSpecified :(克隆到'MyRepo'…:String] [],RemoteException + FullyQualifiedErrorId:NativeCommandError
这是我第一次使用PowerShell或Windows Server。 任何人都可以提供这个问题的一些方向。
客户端脚本:
$s = new-pssession -computername $server -credential $user invoke-command -session $s -scriptblock { cd C:\Repos; ls } invoke-command -session $s -scriptblock { param ($repo, $branch) & '.\clone.ps1' -repository $repo -branch $branch} -ArgumentList $repository, $branch exit-pssession
服务器脚本:
param([string]$repository = "repository", [string]$branch = "branch") git --version start-process -FilePath git -ArgumentList ("clone", "-b $branch https://github.com/MyGithub/$repository.git") -Wait
我已经改变了服务器脚本使用启动过程,它不再抛出exception。 它会创build新的存储库目录和.git目录,但不会从github存储库中写入任何文件。 这闻起来像一个权限问题。 手动再次调用脚本(远程桌面进入亚马逊盒子并从powershell执行它)就像一个魅力。
在本地使用Powershell ISE和Git时,我也会看到这个“错误”。 这实际上不是一个错误; 相反,Powershell ISE错误地解释了Git的控制台输出。 如果您尝试使用基于控制台的Powershell,则应该注意到没有显示错误信息。 看起来,这只是Powershell ISE(以及可能不能很好地处理控制台应用程序输出的其他Powershell主机)的一个特点。
就Powershell而言,这是正确的行为。
不幸的是(至less在我看来),即使没有任何错误,git也会输出大量的信息。 例如git checkout -b somenewbranch会输出一些东西,如修改文件列表到标准输出,但Switched to new branch somenewbranch消息(我认为是最相关的)到stderr 。
处理这个问题最常见的方法之一是将stderr输出redirect到stdout ,例如:
git rebase master 2>&1
这对于我见过的大多数用例来说已经足够了。 如果你想用文本输出本身做些什么,你需要进一步做一些工作,因为Powershell会将源于stderr的行存储为一个RemoteException而不是一个string 。 如何处理需要将输出logging到控制台的内容的简要示例:
$result = Invoke-Expression "& git checkout -b somefeaturebranch 2>&1" $output = "" foreach($line in $result) { $val = "" if($line.GetType().Name -eq "ErrorRecord") { $val = $line.Exception.Message }else{ $val = $line } $output = "$output`r`n$val" } Write-Host $output
您可能会遇到Double Hop问题: http : //blogs.msdn.com/b/clustering/archive/2009/06/25/9803001.aspx