如何编写函数从字符串或文件路径编码或解码 Base64?

问题描述 投票:0回答:2

我有一个函数可以将字符串转换为适用于简单字符串的 base64。 然而类似:

$String = "$program = "notepad"; start $program"

不起作用,中间多余的引号会破坏函数。我尝试使用脚本块,但它也不能完全正常工作。这是我的第一个障碍。
这就是那个功能:

function B64-FromString{
    [CmdletBinding()]
    param (
    
    [Parameter (Mandatory = $True, ValueFromPipeline = $True)]
    [string]$Text
    )
    
    $Text = {$Text}
    $Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)
    $EncodedText =[Convert]::ToBase64String($Bytes)
    $EncodedText
}

我的下一个函数将文件路径作为参数,并将文件的内容转换为base64,然后返回转换后的代码。该函数按预期工作。 这就是那个功能:

function B64-FromFile {
    [CmdletBinding()]
    param (
    
    [Parameter (Mandatory = $True, ValueFromPipeline = $True)]
    [Alias("source")]
    [string]$so,

    [Parameter (Mandatory = $False)]
    [Alias("output")]
    [string]$Path, 

    [Parameter (Mandatory = $False)]
    [Alias("FileName")]
    [string]$File 

    )   

    if (!$File) { $File = "converted.txt" }

    if (!$Path) { $Path = [Environment]::GetFolderPath("Desktop") }
    
    $FilePath = ($Path+"\"+$File)

    $converted = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content -Path $so -Raw -Encoding UTF8)))
    
    return $converted
}

这里的最终目标是拥有一个具有用于编码/解码的参数开关的函数。 还有一个 fromString/fromFile 的开关

我认为在某些地方使用开关:

Param(
    [Parameter(Position=0)]
    [string[]]
    $m
)
$mode = switch ( $m )
{
    "enc"  { "encode-function" }
    "dec" { "decode-function" }
}

}

还有另一个参数和开关来区分从字符串或文件内容接收输入。

我仍在学习 powershell,并且很难概念化这种特定的方法。

powershell switch-statement base64
2个回答
0
投票

经过大约 10 个小时的实验,我想出了一个令我非常自豪的解决方案。

仍然愿意接受任何建设性的批评。

function b64 {
[CmdletBinding(DefaultParameterSetName="encFile")]
param(
    [Parameter(Position=0, ParameterSetName="encFile")]
    [string]
    $encFile,

    [Parameter(Position=0, ParameterSetName="encString")]
    [string]
    $encString,

    [Parameter(Position=0, ParameterSetName="decFile")]
    [string]
    $decFile,

    [Parameter(Position=0, ParameterSetName="decString")]
    [string]
    $decString

)

if ($psCmdlet.ParameterSetName -eq "encFile") {
        $encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content -Path $encFile -Raw -Encoding UTF8)))
        return $encoded
        }

elseif ($psCmdlet.ParameterSetName -eq "encString") {
        $File = "$env:TEMP\foob64.txt"
        Set-Content -NoNewline -Path $File -Value $encString    
        $encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content -Path $File -Raw -Encoding UTF8)))
        Remove-Item $File
        return  $encoded
        }

elseif ($psCmdlet.ParameterSetName -eq "decFile") {
        $data = Get-Content $decFile
        $decoded = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($data))
        return $decoded     
        }

elseif ($psCmdlet.ParameterSetName -eq "decString") {
        $File = "$env:TEMP\foob64.txt"
        Set-Content -NoNewline -Path $File -Value $decString
        $data = Get-Content $File       
        $decoded = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($data))
        Remove-Item $File
        return $decoded
        }
}

0
投票

字符串的编码不起作用。以某种方式在字符串末尾添加了一个“%”。通过这种方式可以更轻松地完成字符串编码(我没有检查文件参数):

function b64 {
  [CmdletBinding(DefaultParameterSetName="encString")]
  param(
      [Parameter(Position=0, ParameterSetName="encFile")]
      [string]
      $encFile,
  
      [Parameter(Position=0, ParameterSetName="encString")]
      [string]
      $encString,
  
      [Parameter(Position=0, ParameterSetName="decFile")]
      [string]
      $decFile,
  
      [Parameter(Position=0, ParameterSetName="decString")]
      [string]
      $decString
  
  )
  
  if ($psCmdlet.ParameterSetName -eq "encFile") {
          $encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content -Path $encFile -Raw -Encoding UTF8)))
          return $encoded
          }
  
  elseif ($psCmdlet.ParameterSetName -eq "encString") {   
          [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($encString))          
          return  $encoded
          }
  
  elseif ($psCmdlet.ParameterSetName -eq "decFile") {
          $data = Get-Content $decFile
          $decoded = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($data))
          return $decoded     
          }
  
  elseif ($psCmdlet.ParameterSetName -eq "decString") {
          $decoded = [Text.Encoding]::Utf8.GetString([Convert]::FromBase64String($decString))
          return $decoded
          }
}
© www.soinside.com 2019 - 2024. All rights reserved.