batch:string和" string"是不同的

时间:2015-07-24 09:24:30

标签: string batch-file

我使用.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不一样。

为什么?那有什么区别?

由于

2 个答案:

答案 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所述