You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI通过SSH执行PowerShell Where-Object报错问题求助

解决GitLab流水线SSH执行PowerShell含Where-Object报错的问题

问题根源

通过Alpine的SSH客户端传递PowerShell命令时,管道符|和脚本块的{}会被Shell(sh)提前解析,导致PowerShell无法正确接收完整命令,从而触发拼写错误或无效命令的提示。

解决方案一:修正命令转义

调整YAML中的PowerShell命令转义规则,对Shell会解析的特殊字符进行转义:

- sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no "$WEBSERVER" <<EOF
      powershell.exe -Command "
      Write-Host 'Backup start';
      \$maxAgeDate = (Get-Date).AddDays(-2);
      \$filesToCopy = Get-ChildItem \$localDirectory \| Where-Object \{ \$_.LastWriteTime -gt \$maxAgeDate \};
      Write-Host \"Files to copy - \$(\$filesToCopy.Count)\";
      Write-Host 'Backup end'
      "
EOF

关键修改点:

  • 管道符|前添加反斜杠转义:\|
  • 脚本块的{和}前添加反斜杠转义:\{、\}

解决方案二:使用仓库脚本文件执行(推荐)

既然脚本保存在代码仓库,直接通过scp将脚本传到Windows服务器再执行,彻底避免转义混乱:

  1. 仓库中创建backup.ps1脚本:
Write-Host 'Backup start'
$maxAgeDate = (Get-Date).AddDays(-2)
$filesToCopy = Get-ChildItem $args[0] | Where-Object { $_.LastWriteTime -gt $maxAgeDate }
Write-Host "Files to copy - $($filesToCopy.Count)"
Write-Host 'Backup end'
  1. GitLab流水线中添加执行步骤:
# 将仓库脚本传到Windows临时目录
- sshpass -p "$SSH_PASSWORD" scp -o StrictHostKeyChecking=no ./backup.ps1 "$WEBSERVER":C:\Windows\Temp\backup.ps1
# 执行脚本,允许非签名脚本运行并传递目录参数
- sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no "$WEBSERVER" powershell.exe -ExecutionPolicy Bypass -File C:\Windows\Temp\backup.ps1 "$localDirectory"

这种方式更易维护,完全匹配你适配多台服务器的需求,无需在每台服务器本地部署脚本。

内容的提问来源于stack exchange,提问作者neverending-despair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:22:42