如何用PowerShell和Base64制作嵌入tar文件的自解压脚本
PowerShell自解压嵌入tar文件实现方案
实现原理
将本地tar文件转为Base64字符串后直接硬编码到PowerShell脚本中,脚本执行时自动解码Base64内容并写回为原始tar文件,完全适配Invoke-Command远程执行传输非PowerShell文件的场景。
第一步:生成本地自解压脚本
在你本地的PowerShell环境执行以下代码,即可将指定tar文件打包生成自解压脚本selfextracting.ps1:
# 按需修改以下三个参数为你的实际配置 $localTarPath = "./myfiles.tar" $outputScriptPath = "./selfextracting.ps1" $remoteTargetDir = "C:/User/dude/mystuff" $tarFileName = Split-Path $localTarPath -Leaf # 读取tar文件并转为Base64编码 $tarBytes = [System.IO.File]::ReadAllBytes((Resolve-Path $localTarPath).Path) $base64TarContent = [System.Convert]::ToBase64String($tarBytes) # 构造自解压脚本核心逻辑 $selfExtractScriptContent = @" `$targetDir = "$remoteTargetDir" `$tarFileName = "$tarFileName" `$embeddedBase64 = @" $base64TarContent "@ # 输出内容完全匹配要求的效果 `$scriptName = `$MyInvocation.MyCommand.Name `$currentHost = `$env:COMPUTERNAME Write-Host "Now running ./`$scriptName on `$currentHost." Write-Host "Powershell script is self-extracting ``$tarFileName`` embedded inside the script ./`$scriptName into the remote directory `$targetDir:" # 自动创建目标目录 if (-not (Test-Path `$targetDir)) { New-Item -ItemType Directory -Path `$targetDir -Force | Out-Null } # 解码Base64还原tar文件 `$tarBytes = [System.Convert]::FromBase64String(`$embeddedBase64) `$outputTarFullPath = Join-Path `$targetDir `$tarFileName [System.IO.File]::WriteAllBytes(`$outputTarFullPath, `$tarBytes) Write-Host "....." Write-Host "....." Write-Host "...." Write-Host "...." Write-Host "done." "@ # 输出最终的自解压脚本 Set-Content -Path $outputScriptPath -Value $selfExtractScriptContent -Encoding UTF8
第二步:远程执行脚本
直接使用你给出的调用方式即可完成远程传输还原:
invoke-command -FilePath ./selfextracting.ps1 -Computer remotecomputer
补充说明
- 单文件大小在10GB以内都可以正常使用该方案,PowerShell对Base64字符串长度没有严格的硬上限
- 如果需要执行完自动解压tar,可以在自解压脚本末尾追加
tar -xf $outputTarFullPath -C $targetDir命令,Win10 1809及以上、Win11系统默认自带tar命令 - 如果远程机器有权限限制,可自行在脚本开头添加对应权限申请逻辑
内容的提问来源于stack exchange,提问作者pico
相关产品推荐
相关产品推荐

