在ruby周围包裹powershell

时间:2017-07-24 13:11:15

标签: ruby powershell devops

我有Linux和Windows的混合环境,但构建脚本是在Ruby中创建的。我试图在涉及PSRemoting的每个Web服务器上做一些更改,但看起来我有一些问题将字符串转换为powershell命令:

%x{ powershell.exe invoke-command  -computername iistest.neogov.net -scriptblock { $oldpath = c:\webdata\corehr; $newpath = c:\webdata\corehr\07241439; Get-ChildItem -Path $oldpath -Recurse | where {($_.FullName -notmatch $oldpath.replace('\','\\')) -or ($_.FullName -notmatch $newpath.replace('\','\\'))}} }.strip.downcase

这个产品是:

where-object
  

'where-object'未被识别为内部或外部命令,可操作程序或批处理文件。

如果我仅使用where替换|,则错误不同:

  

在语句块或类型定义中缺少关闭'}'。       + CategoryInfo:ParserError:(:) [],ParentContainsErrorRecordException       + FullyQualifiedErrorId:MissingEndCurlyBrace

     

信息:无法找到给定模式的文件

我认为管道(df = df.loc[3., 'columnA.'] print (df) index. 3.0 data. 3.0 data. 3.0 data. 3.0 data. Name: columnA., dtype: object )可能会让ruby解释器感到困惑,但不确定如何避免它?

1 个答案:

答案 0 :(得分:1)

它可能只是Anwser的一部分,但对于CMD来说,是|的转义字符是^,如果使用^ |然后输出不同但不正确(我确实改变了一些代码以使其工作,所以你可能想要复制和调整我的),Ruby可能会使用相同或不同的东西,我不确定,但我相信你是在右边轨道。

powershell.exe -command {invoke-command  -scriptblock {$oldpath = "C:\Users\...\corehr"; $newpath = "C:\Users\...\corehr\07241439"; Get-ChildItem -Path $oldpath -Recurse | where {($_.FullName -notmatch $oldpath.replace('\','\\')) -or ($_.FullName -notmatch $newpath.replace('\','\\'))}}}

使用CMD结果

INFO: Could not find files for the given pattern(s).

但它在powershell中给出了:

    Directory: C:\Users\...\corehr


Mode                LastWriteTime     Length Name                                                        
----                -------------     ------ ----                                                        
d----         24-7-2017     15:41            test1                                                       
d----         24-7-2017     15:41            test2    

更换|与^ |结果

invoke-command -scriptblock {$oldpath = C:\Users\...\corehr; $newpath = C:
\Users\...\corehr\07241439; Get-ChildItem -Path $oldpath -Recurse | where
{($_.FullName -notmatch $oldpath.replace('\','\\')) -or ($_.FullName -notmatch
$newpath.replace('\','\\'))}}

现在它认为-command输入是一个字符串?但正如您所看到的,管道字符在此输出中正确显示。