【问题标题】:Powershell - odd line feed behaviourPowershell - 奇怪的换行行为
【发布时间】:2014-07-26 13:23:45
【问题描述】:

我是 Powershell 的新手,如果这是一个明显的问题,我深表歉意。我有以下分隔字符串的函数:

 [int[]]$rec02 = 3,2,1,4,3,3,5,5,6,1,19,45,2,3,50

 function delimitString([string]$text, [int[]]$arrDelims)
        {
                [string]$out;
                [int]$total=0;
                foreach($d in $arrDelims)
                {        
                    $out += $text.substring($total,$d)+",";
                    $total +=$d;
                }

                $out += $text.substring($total,$text.length-$total)+",";
                return $out;
        }

当它被如下调用时: delimitString "gjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffllllllllll" $rec02

如何抑制/为什么在输出的开头/结尾处有新的换行符/回车符?

gjj,jj,j,jjjj,jjj,jjj,jjjjj,jjjjj,jjjjjj,j,jjjjlllllllllllllll,llllllllllllllllll llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffllllllllll,

我最终将它写入一个文件,因此我在输出中以空行结束。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    [string]$out 未初始化。它输出名为“out”的变量作为返回的补充。由于没有$out 变量,在输出之前它使用默认值(空字符串)创建它。以这种方式输出时,在每行输出的末尾添加换行符。

    所以,[string]$out 实际上(在你的情况下)是New-Object -TypeName 'System.String' -ArgumentList @([System.String]::Empty),正如你所看到的,它是返回对象的函数

    New-Item 函数也存在同样的问题。它返回新项目的对象,因此,当您在函数中使用它时,您应该将输出发送到 null

        Function TestReturn {
        New-Item -Path $( [System.IO.Path]::GetTempFileName() + '.test' ) -ItemType 'File'
        New-Item -Path $( [System.IO.Path]::GetTempFileName() + '.test' ) -ItemType 'File'
        return "Hello, World"
    }
    TestReturn
    

    返回

    ;    Mode                LastWriteTime     Length Name                                                                                                                                             
    ;----                -------------     ------ ----                                                                                                                                             
    ;-a---        26.07.2014      9:08          0 tmpD9B4.tmp.test                                                                                                                                 
    ;-a---        26.07.2014      9:08          0 tmpDA03.tmp.test                                                                                                                                 
    ;Hello, World
    

    要省略它,您应该使用New-Item ... | Out-Null 或将值放入变量$temp = New-Item ... 所以正确的形式是(向右滚动!)

            Function TestReturn {
        New-Item -Path $( [System.IO.Path]::GetTempFileName() + '.test' ) -ItemType 'File' | Out-Null
        New-Item -Path $( [System.IO.Path]::GetTempFileName() + '.test' ) -ItemType 'File' | Out-Null
        return "Hello, World"
    }
    TestReturn
    

    因此,您应该使用 $out='' 或(您的粉丝类型化)$out=[String]'' 而不是 [string]$out 。那些对线做非常不同的事情。您尝试创建和输出变量。 $out='' 行只是初始化它。

    要写入文件,您应该使用$somevar | Out-FileOutFile -InputObject 表单

    [int[]]$rec02 = @(3,2,1,4,3,3,5,5,6,1,19,45,2,3,50)
    
     function delimitString([string]$text, [int[]]$arrDelims)
            {
                    $out='';
                    $total=0;
                    foreach($d in $arrDelims)
                    {        
                        $out += $text.substring($total,$d)+",";
                        $total +=$d;
                    }
    
                    $out += $text.substring($total,$text.length-$total)+",";
                    return $out 
            }
    $tempFile = [System.IO.Path]::GetTempFileName()
    $somevar = delimitString "gjjj...." $rec02 
    Write-Host -ForegroundColor Red -NoNewline "BEGIN"
    Write-Host -ForegroundColor Green -NoNewline $somevar
    Write-Host -ForegroundColor Red "END"
    
    Write-Host -ForegroundColor Red "Out Length: $($somevar.Length)"
    $tempFile = [System.IO.Path]::GetTempFileName()
    Write-Host -ForegroundColor Green "TempFile: $($tempFile)"
    Out-File -FilePath $tempFile -Encoding 'Ascii' -InputObject $somevar
    $somevar = Get-Content -Path $tempFile -Encoding 'Ascii'
    

    注意:编码为“UTF-8”的 Out-File 在开头添加 BOM 记录。为了避免这种情况,请使用[System.IO.File]::WriteAllText($path,$data,[System.Text.Encoding]::UTF8)

    【讨论】:

      【解决方案2】:

      我不确定我是否完全理解了这个问题,但您似乎正在尝试以这种方式初始化变量[string]$out;。实际上,您只是将 $out 变量(您以前从未使用过)打印为字符串,因此您不会通过使用这段代码 $out += 向字符串添加内容来获得预期的结果。

      只需尝试将[string]$out; 更改为$out = "";,您应该能够正确运行您的代码(现在$outString)。

      【讨论】:

      • 我稍微修改了使用示例。本质上,我用一个字符串调用该函数,并将其拆分为函数输入数组中定义的间隔。我使用 out 变量来构建分隔字符串 - 这被分配给并且输出是正确的,但是输出的开始/结束有意外的回车/换行字符。
      • 如果你尝试将返回的值保存到一个变量中,你会得到什么,让它调用$a,然后调用$a.GetType().fullname?你得到System.Object[] 还是System.String
      • 很奇怪,如果我尝试执行它,我会得到一个System.Object[]
      • 这不是基本类型吗?
      • ("a").GetType().FullName -> System.String @("a").GetType().FullName -> System.Object[] 我从你的函数中得到一个 System.Object[] 作为输出变量,如果你得到一个 System.String 也许我们正在查看另一段代码;)
      猜你喜欢
      • 2021-10-02
      • 2018-10-17
      • 2016-11-06
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 2014-09-24
      相关资源
      最近更新 更多