执行远程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执行)就像魅力一样。
答案 0 :(得分:10)
无论何时从PowerShell调用外部可执行文件,我强烈建议您使用Start-Process
。与直接调用可执行文件相比,Start-Process
cmdlet处理命令行参数要好得多。
重要:您还必须注意,如果您运行两个单独的Invoke-Command
命令(除非您使用的是-Session
参数),那么您将在两个命令中运行完全不同的PowerShell Remoting会话!如果使用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;
-WorkingDirectory
cmdlet上还有一个Start-Process
参数,允许您指定进程的工作目录。您可能最好不要使用Set-Location
cmdlet来设置PowerShell会话的“当前目录”,而是最好指定进程工作目录的完整路径。例如,假设您在c:\repos\repo01
中有一个Git存储库,而您的Git exe在c:\git
中。你不应该担心PowerShell的“当前目录”在哪里,而是专注于指定完整路径:
以下是如何实现这一目标的示例:
Start-Process -FilePath c:\git\git.exe -ArgumentList 'clone "c:\repos\repo01" "c:\repos\repo02"" -Wait -NoNewWindow;
注意:我不知道Git命令,但您应该能够调整上面$ArgumentList
变量的值,以使其适合您。在PowerShell中,您可以在单引号内放置双引号,而不必担心转义它们。