我使用.bat(generate.bat)将字符串转换为以base64编码的sha256
<nul set /p =%1 | openssl dgst -sha256 -binary 2>NUL | openssl base64 2>NUL
当我使用generate.bat
时:
generate.bat foobar
输出是:
qjV6SxGt0Ex4fN0XvaqMGbJCxFVF9ksSlLYfmtCR0G4=
但是当我执行时:
generate.bat "foobar"
然后输出是:
w6uP8Tcg6K2QR905Rms8iXTlksL6OD1KOWBxTK7wxPI=
这意味着"foobar"
和foobar
不一样。
为什么?那有什么区别?
由于
答案 0 :(得分:1)
@npocmaka建议的不引用是优雅的,应该有用。
这是另一种方法:
Pods
答案 1 :(得分:1)
Windows CMD将封闭参数视为参数的一部分(字符串的一部分)。
如果您希望外引号始终是字符串的一部分(即使它们未在命令行中提供),那么您可以执行以下操作:
<nul set /p ^"="%~1"^" | openssl dgst -sha256 -binary 2>NUL | openssl base64 2>NUL
如果您不希望封闭的引号包含在字符串中,那么通常可以这样做:
<nul set /p "=%~1" | openssl dgst -sha256 -binary 2>NUL | openssl base64 2>NUL
上述策略通常有效,但如果字符串以空格或\r\n
开头,那么用于打印不带=
的字符串的SET / P hack不起作用。
这是一个令人讨厌的问题。我想最好的选择是切换到使用powerShell。 (我对PowerShell不太熟悉,所以我不知道语法)。
如果你真的想使用批处理,你可以使用一个相当复杂的过程来打印没有\r\n
的任何字符串,如https://stackoverflow.com/a/19468559/1012053所述