在其中运行带有Git命令的远程PowerShell脚本会导致NativeCommandError

 dsafdasdfddsa_459 发布于 2023-02-05 09:56

我在执行远程PowerShell脚本时遇到错误.在我的本地计算机上,我运行的PowerShell脚本Invoke-Command用于cd进入远程Amazon Windows Server实例上的目录,以及后续Invoke-Command执行脚本,该脚本位于该服务器实例上.服务器上的脚本正在尝试从GitHub git克隆存储库.我可以在服务器脚本中成功地做一些事情,比如"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调用外部可执行文件,我强烈建议您使用Start-Process.该Start-Process比直接调用可执行小命令处理命令行参数要好得多.

    重要提示:您还必须注意,如果您运行两个单独的Invoke-Command命令(除非您使用该-Session参数),您将在两个完全不同的PowerShell远程处理会话中运行!如果使用cd(也就是别名Set-Location)命令,则在运行Git命令时,该命令的结果将不会持久保存到新会话中.

    $GitExe = '{0}\path\to\git.exe' -f $env:SystemDrive;
    $ArgumentList = 'clone "c:\path\with spaces\in it"';
    Start-Process -FilePath $GitExe -ArgumentList $ArgumentList -Wait -NoNewWindow;
    

    cmdlet -WorkingDirectory上还有一个参数Start-Process,允许您指定进程的工作目录.Set-Location您可能最好不要使用cmdlet来设置PowerShell会话的"当前目录",而是最好指定进程工作目录的完整路径.例如,假设你有一个Git存储库c:\repos\repo01,你的Git exe就在c:\git.你不应该担心PowerShell的"当前目录"在哪里,而是专注于指定完整路径:

      Git可执行文件

      Git存储库

    以下是如何实现这一目标的示例:

    Start-Process -FilePath c:\git\git.exe -ArgumentList 'clone "c:\repos\repo01" "c:\repos\repo02"" -Wait -NoNewWindow;
    

    注意:我不知道Git命令,但您应该能够调整$ArgumentList上面变量的值,以使其适合您.在PowerShell中,您可以将双引号放在单引号内,而不必担心转义它们.

    2023-02-05 10:01 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有