【问题标题】:Write-host string and get the same as input for further execution写入主机字符串并获得与输入相同的内容以供进一步执行
【发布时间】:2017-03-03 04:43:06
【问题描述】:

我试图通过获取回显字符串作为输入来回显字符串并使用 base64 进行编码。

Write-Host "Hello World" | $b = [System.Convert]::FromBase64String($_) ; [System.Text.Encoding]::UTF8.GetString($b)

但遇到错误,

At line:1 char:28
+ Write-Host "Hello World" | $b = [System.Convert]::FromBase64String($_) ; [System ...
+                            ~~
Expressions are only allowed as the first element of a pipeline.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ExpressionsMustBeFirstInPipeline

对此有任何想法

【问题讨论】:

    标签: powershell


    【解决方案1】:

    这意味着您尝试通过管道传输的函数不接受管道。

    您需要使用变量来传递给函数。
    例如。

    // convert string to base64
    $a = "Hello World"
    $b = [System.Text.Encoding]::UTF8.GetBytes($a)
    $c = [System.Convert]::ToBase64String($b)
    Write-Host $c
    

    【讨论】:

    • 是的,这也对我有用。但我会从其他脚本传递字符串,所以我必须以该字符串的形式获取输入。
    • 要将命令的输出保存到变量中,您可以尝试 [PowerShell: Capture the output from external process that writes to stderr in a variable ](stackoverflow.com/questions/8184827/…)
    【解决方案2】:

    您可以使用Write-output 并将其通过管道传送到New-Variable

    Write-output "test" | New-Variable -Name b
    $b = [System.Convert]::FromBase64String($b)
    [System.Text.Encoding]::UTF8.GetString($b)
    

    您也可以为此创建函数:

    function Verb-Noun{
        Param( [Parameter(Mandatory=$true,ValueFromPipeline=$true,Position=0)][string]$string )
    
        [System.Text.Encoding]::UTF8.GetString( ( [System.Convert]::FromBase64String($string) ) )
    }
    
    Write-Output "test" | Verb-Noun
    

    请注意,您必须使用Write-output 来传递字符串。 Write-Host 在这里不起作用。

    此外,您的字符串“Hello world”无法使用此方法转换,因为[System.Convert]::FromBase64String($string) 仅适用于长度为 4 的倍数的字符串。(我想这只是一个不太好的示例)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2011-04-10
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多