Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Teamcity powershell runner在服务器上远程运行命令_Powershell_Teamcity_Remote Server - Fatal编程技术网

Teamcity powershell runner在服务器上远程运行命令

Teamcity powershell runner在服务器上远程运行命令,powershell,teamcity,remote-server,Powershell,Teamcity,Remote Server,我有一个奇怪的问题,每当我试图远程调用我们的测试服务器时,TeamCity就会挂起 目前,构建步骤包括: 模板文件 在中编译代码 一揽子工程 将包发送到测试服务器 在测试服务器上解压缩包 现在,直到最后一个阶段,解压远程服务器上的包,一切都正常。现在我只想运行一个powershell命令来连接并运行命令,然后退出。如果我从远程桌面使用powershell,并且提供的用户凭据是正确的,那么这一切都可以正常工作 正在运行的示例如下所示: $password = ConvertTo-SecureS

我有一个奇怪的问题,每当我试图远程调用我们的测试服务器时,TeamCity就会挂起

目前,构建步骤包括:

  • 模板文件
  • 在中编译代码
  • 一揽子工程
  • 将包发送到测试服务器
  • 在测试服务器上解压缩包
现在,直到最后一个阶段,解压远程服务器上的包,一切都正常。现在我只想运行一个powershell命令来连接并运行命令,然后退出。如果我从远程桌面使用powershell,并且提供的用户凭据是正确的,那么这一切都可以正常工作

正在运行的示例如下所示:

$password = ConvertTo-SecureString "%PasswordVar%" -AsPlainText -Force
$credentials = New-Object System.Manager.Automation.PsCredential("%UsernameVar%", $password)
etsn -computername %TestServer1Var% -Credential $credentials
当这被称为TeamCity just挂起时,必须手动停止,否则它将永远停留在代理的这一步上。我尝试过不使用凭据,我尝试过不使用etsn和完整的命令名,还尝试过其他远程命令方法,但似乎没有任何效果


那么,有没有办法让TeamCity实际运行这些命令?或者找出是什么导致它不确定地处理此步骤?

这是一个小问题的混合体,对于1来说,当通过team city查询时,用户没有正确地解析域,因此需要将其添加到用户名
中-user@some-域
。还有一个问题是,在进行PSSESSION连接时,会遇到某种连接限制,但是如果我改为使用脚本块调用命令,则效果会很好

如果它对这里的任何人都有帮助的话,那就是我最后使用的解压远程文件的命令,使用7zip命令行作为本机解决方案似乎从来都不起作用

$password = ConvertTo-SecureString "%TestServer.Password%" -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PsCredential("%TestServer.Username%",$password)

$scriptBlock1 = {`
`
    $sevenZip = "%TestServer.ReleasePath%\7za.exe"; `
    &$sevenZip x %TestServer.ReleasePath%\web-package.zip -o%TestServer.WebPath% * -aoa; `
}
Invoke-Command -computername %TestServer.Server% -Credential $credentials -scriptblock $scriptBlock1

需要记住的一点是,用户名包含上面列出的域,此外,还需要使用神奇的引号将脚本块分散到多行以及分号上,以指示任务应一起运行。

Invoke Command
如果您必须在服务器上运行的脚本很短,并且您必须等待它完成执行,则该命令工作正常

我的问题是,我想在远程服务器上启动一项服务,只需在服务器中记录这些内容,然后让teamcity build继续执行。 使用
Invoke命令
,teamcity确实远程执行了该流程,但一直在等待该流程完成返回。如果您正在寻找只调用服务器上长时间运行的进程而忘记它的东西,请尝试以下方法:

此解决方案最适合我:

1) 将要远程执行的脚本放在服务器内的文件中。。比如startup.bat

call Powershell.exe -executionpolicy remotesigned -File %1\bin\startup.ps1 
这基本上执行位于web服务器中的另一个powershell脚本

Start-Process -WindowStyle hidden java -ArgumentList '-jar', "$APP_HOME\bin\test-api.jar" -PassThru
确保有teamcity构建步骤将这些文件部署到Web服务器

2) 创建teamcity构建步骤以执行powershell脚本文件

Teamcity将执行的Powershell命令示例:

$SERVER = (Get-Item env:SERVER_NAME).Value
$APP_HOME = (Get-Item env:APP_HOME).Value
$STARTUP_SCRIPT_PATH = "$APP_HOME\bin\startup.bat"

Function Remote-Process {
  param(
    [string]$ComputerName,
    [string]$Cmd
  )

  echo "Invoking Remote Script.."
  $RETURNVAL = ([WMICLASS]"\\$ComputerName\ROOT\CIMV2:win32_process").Create($Cmd)
  echo $RETURNVAL
}

$COMMAND = "$STARTUP_SCRIPT_PATH $APP_HOME"
$output = Remote-Process $SERVER $COMMAND

echo $OUTPUT
其中APP_HOME是部署web应用的文件夹(在远程服务器上)的绝对路径


就这样。这样,您甚至可以执行服务,远程进程将不会被终止,并允许您继续构建链

只是对公认答案的补充

$scriptBlock = [Scriptblock]::Create(@'
  echo 'before'
  ipconfig /all
  echo 'after'
'@)

Invoke-Command -ComputerName AD01 -ScriptBlock $scriptBlock


上一步允许定义
%PowerShell.header%
%PowerShell.footer%
参数以不在TC步骤中写入样板代码

您尝试过
AllowRedirection
参数设置吗?这将导致您的脚本记录您将在交互控制台中看到的命令运行的详细信息。No No No No No No No No No No No No No No No No modHFGen.dll将此参数添加到命令并查看是否提供更多信息添加到调用中,但它仍然挂起,它已经在最后一步上运行了10分钟,没有给我任何反馈。嗯-我不确定,但这可能是许可问题吗?我不认为estn需要管理员权限,但我可能错了(目前不是在windows上)。