【问题标题】:Powershell: Jenkins build hangs attempting to invoke remote PS scriptPowershell:Jenkins 构建挂起尝试调用远程 PS 脚本
【发布时间】:2013-12-05 01:55:56
【问题描述】:

所以我使用 Jenkins powershell 插件简单地将我构建的包复制到远程共享,解包并调用另一个执行某些特定于应用程序安装的 powershell 脚本(它位于包中)。

现在发生的情况是,构建 powershell 脚本成功执行,直到我在远程共享中执行该脚本,当它执行该行时它只是挂起......

我在远程机器上的执行策略不受限制。

这是我正在做的事情的 sn-p:

#create temporary session with timeout of 2 minutes
$pso = new-pssessionoption -OperationTimeout 120000
$session = New-PSSession -ComputerName $env:remoteServer -sessionOption $pso
Enter-PSSession $session

#Copy distribution to CD server
Copy-Item $src $deployDir -Recurse -Force 

#Locate install script
$installScript = Get-Item($deployDir + "*-distribution\*\install.ps1")
write-host ("Executing install script at location " + $installScript)

#Execute install script
& $installScript $env:installArgs -Y

请注意,我是编写 powershell 的新手,所以如果我的脚本是 awf ,我深表歉意:D

有没有人经历过这种行为并且可以指出我错过了什么/做错了什么?

谢谢,

【问题讨论】:

  • 您是在 PowerShell 提示符下手动执行上述操作还是脚本的一部分?如果它是脚本的一部分,那么使用 Enter-PSSession 不是您想要使用的。它仅供交互使用。在脚本中,您将使用Invoke-Command -session $session
  • 它是在 jenkins 构建中运行的脚本的一部分。除了这种不好的做法,它不会阻止我的脚本工作吗?

标签: powershell jenkins powershell-remoting


【解决方案1】:

在脚本中使用Enter-PSSession 会导致脚本挂起。请改用Invoke-Command。顺便说一句,如果您使用 -FilePath 参数,它将为您将脚本从本地 PC 复制到远程 PC。但是,如果该脚本引用了其他脚本,则必须复制这些脚本。

Invoke-Command -session $session -FilePath c:\somepath\install.ps1 -Arg "$env:InstallArgs -Y"

如果您想自己处理复制,请执行以下操作:

Invoke-Command -session $session -Arg $src,$deployDir,$env:installArgs -Scriptblock {
    param($src, $deployDir, $installArgs)
    Copy-Item $src $deployDir -Recurse -Force
    $installScript = GetItem "$deployDir*-distribution\*\install.ps1"
    & $installscript "$installArgs -Y"

}

【讨论】:

  • 使用 -FilePath 时会将其复制到哪里?即执行位置是什么?另外我感到困惑的是执行另一个脚本时 - 它运行的权限是什么,它是否知道它的新环境,如果它实际上已经被复制了。
  • AFAICT 它将脚本文件的内容作为字符串通过远程连接传递,然后执行该字符串而不将其保存到文件中。
  • 默认情况下,在远程会话中运行的脚本以管理员权限运行。
  • 我认为它的 -ArgumentList 不是吗?另外,当它尝试执行安装脚本时如何避免这个提示?
  • Invoke-Command 不会导致提示,因此它必须是您的 installscript 中正在提示的内容,或者它可能是 installscript 的参数。如果不知道 installscript 在做什么以及通过 $installArgs 传入的参数是什么,就很难知道。
猜你喜欢
  • 2016-11-18
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2011-06-20
  • 2013-07-19
  • 1970-01-01
相关资源
最近更新 更多