Parece que você não pode usar o ponto de interrogação ou qualquer curinga em que a linha == b O operador == não aceita? como especial, é considerado literal. E não olha para nomes de arquivos também. Então, isso só serve para provar que realmente é preciso? como literal.
Além disso, no Linux, se você fez eco? ele seria interpretado pelo shell antes de ir para o comando echo e retornaria um nome de arquivo de um comprimento de caractere. No Windows? ou * não são interpretados pelo shell, eles são passados para um comando. DIR usa? e *, trata-os como especiais, o ECHO não, e o teste de igualdade se == não, e apenas ecoaria um ponto de interrogação. Eu duvido que o que você escreveu lá seja válido no bash também. Como no linux? e * estão sempre relacionados a nomes de arquivos e você parece querer apenas a comparação de variáveis.
C:\a>touch BE99 <---- a gnuwin32 touch line to create a file called BE99
C:\a>if BE99==BE9? echo true
C:\a>if "BE99"=="BE9?" echo true
C:\a>
C:\a>dir BE9? /b
BE99
C:\a>
Então? trabalha com DIR, mas não com um == b
Mas além disso, se você fizer "4" == 4, então ele dirá false, já que você tem que fazer aspas ao redor de ambos ou em torno de nenhum deles. A razão para as cotações é se você fizer% var% ==% var% e% var% estiver vazio, então você tem um erro de sintaxe porque ele funciona por substituição, substituição, então você não obtém nada em nenhum dos lados do == então apenas se = =. Então é melhor usar aspas, do que sem aspas. Alguns usam []. if [% var%] == [% var%]
Você pode usar isso
C:\a>set test=BE9923432423
C:\a>echo %test:~0,4%
BE99
Então, no seu código, você poderia fazer if "%test:~0,4%"=="BE99" (