执行远程 PowerShell 脚本时出现错误。我在本地计算机上运行一个 PowerShell 脚本,该脚本使用Invoke-Command
进入cd
远程 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
我已将服务器脚本更改为使用启动进程,它不再抛出异常。它创建新的存储库目录和 .git 目录,但不会写入 github 存储库中的任何文件。这似乎是权限问题。再次手动调用脚本(远程桌面进入亚马逊框并从 powershell 执行它)效果很好。
答案1
就 Powershell 而言,这是正确的行为。
stderr
不幸的是(至少在我看来),即使没有任何错误,git 也会输出大量信息。例如git checkout -b somenewbranch
,它会将修改的文件列表等内容输出到 stdout,但Switched to new branch somenewbranch
将消息(我认为这是最相关的消息)输出到stderr
。
处理此问题的最常见方法之一是将stderr
输出重定向到stdout
,例如:
git rebase master 2>&1
对于我见过的大多数用例来说,这已经足够了。如果你想对文本输出本身进行一些操作,你需要做更多的事情,因为 Powershell 会将 stderr 来源行存储为 而不是RemoteException
。以下是string
一个简短的示例,说明如何处理需要将输出记录到控制台的内容:
$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
答案2
在本地使用 Powershell ISE 和 Git 时,我也看到了这个“错误”。这实际上不是一个错误;相反,Powershell ISE 错误地解释了 Git 的控制台输出。如果您尝试基于控制台的 Powershell,您应该注意到没有显示任何错误信息。这似乎只是 Powershell ISE 的一个特性(也可能是其他不能很好地处理控制台应用程序输出的 Powershell 主机的特性)。