使用批处理脚本中的 powershell 语句解码字符串时,感叹号 (!) 值被排除返回

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

我正在循环读取一个文件的参数(input.txt),它有一个编码的字符串值,该编码值将使用 Powershell 命令解码,但是感叹号“!”符号在解码后被排除。

@echo off
setlocal EnableDelayedExpansion

set input_file=%cd%\input.txt

for /f "token=1-2" %%a in (%input_file%) do (
set param1=%%a
set param2=%%b

for /f "tokens=* delims=" %%i in ('powershell "[Text.Encoding]::utf8.GetString([Convert]::FromBase64String('!param2!'))"') do set "decoded=%%i"

echo !decoded!
)

exit /b

:EOF

Param2
值是
TWF0dCQhMyM=
它的解码值应该是
Matt$!3#"
但是它正在返回
Matt$3#"

为什么不包括感叹号“!”符号,解决方案是什么?请指教

注意:在这里,当我得到这样的变量值时 %variable_name% 它没有工作,只有当我使用 !variable_name!它正在工作

batch-file
1个回答
0
投票

在使用

%%i
之前,您需要禁用延迟扩展。

@echo off
setlocal EnableDelayedExpansion
set "FromBase64=powershell "[Text.Encoding]::utf8.GetString([Convert]::FromBase64String"
set "input_file=%cd%\input.txt"

for /f "tokens=1-2" %%a in (%input_file%) do (
  set param1=%%a
  set param2=%%b

  for /f "tokens=* delims=" %%i in ('%FromBase64%('!param2!'))"') do (
    setlocal DisableDelayedExpansion
    echo(%%i
    endlocal
  )
)

exit /b

或者完全禁用延迟扩展并避免使用 param2 变量

@echo off
setlocal DisableDelayedExpansion
set "FromBase64=powershell "[Text.Encoding]::utf8.GetString([Convert]::FromBase64String"
set "input_file=%cd%\input.txt"

for /f "token=1-2" %%a in (%input_file%) do (
  set param1=%%a

  for /f "tokens=* delims=" %%i in ('%FromBase64%('%%b'))"') do (
    echo(%%i
  )
)

exit /b
© www.soinside.com 2019 - 2024. All rights reserved.