Porque é que o conjunto de chamadas funciona de forma diferente num ficheiro CMD Versus um ficheiro.CMD?

estou a tentar usar as versões de manipulação de texto do CMD do Windows de uma forma programática. As duas versões de " SET " São ...

define New_ String= % String:Old_Text=New_Text %

: - - - no texto variável substituir o Old_ text pelo New_Text, e o resultado do Regresso é a variável New_String

Defina New_ String= % String:~Number_ Of_chars_to_skip, Number_of_chars_to_ Keep%

: - - - In variable String extract Number_Of_Chars_To_Keep after skipping Number_Of_Chars_To_Skip, and devolver o resultado na variável New_String

: - - - Old_Text, New_Text, Number_Of_Chars_To_Skip, Number_Of_Chars_To_Keep devem ser todos literais e não variáveis. Então, o uso típico seria assim ...

SET New_String=%String:abcd=fghi%

SET New_String=%String:~2,4%

: --- uso como este não vai funcionar ...

SET New_String=%String:%Old_Text%=%New_Text%%

SET New_String=%String:~%Skip_Count%,%Keep_Count%%

: - - - para fazer os dois "SET"acima você tem que chamar "SET", como ...

CALL SET New_String=%%String:%Old_Text%=%New_Text%%%

CALL SET New_String=%%String:~%Skip_Count%,%Keep_Count%%%
Então, tenho este fragmento de código de teste...

@ SET "Chars=" & SET "String=0123456789" & SET "Skip=1" & SET "Keep=3"

CALL SET Chars=%%String:~%Skip%,%Keep%%%

@ ECHO Chars="%Chars%" (expected to be "123")

: - - - a partir de um ficheiro CMD isto funciona correctamente. A chamada foi expandido para

SET Chars=%string:~1,3%

: - - - e devolveu o resultado esperado 123

: - - - Mas, e um grande mas é, a partir de uma janela CMD (com as mesmas variáveis) o mesmo conjunto de chamadas devolve isto ...

%0123456789Skip%,3%%

Porque é que isto não funciona numa janela de CMD? Pesquisei por aí e não encontrei nenhuma informação que explique porquê.

Author: Larry8811, 2017-03-20

1 answers

De acordo com o tópico como é que o Interpretador de comandos do Windows (CMD.Processar scripts?, arquivos em lote e linhas de comando são processadas de forma diferente, particularmente quando se trata de expansão de variáveis de ambiente.

O analisador de ficheiros em lote substitui dois sinais percentuais consecutivos por um literal, enquanto o analisador da linha de comandos não substitui. Assim, CALL SET Chars=%%String:~%Skip%,%Keep%%% funciona dentro de um ficheiro em lote, mas não em cmd.

Para obter o mesmo resultado em cmd, pode usar isto:

CALL SET Chars=%^String:~%Skip%,%Keep%%

Na verdade, isto não faz nada a não ser especificar uma variável chamada ^String, que se espera não ser definida. Em contraste com o analisador de ficheiros em lote, o analisador da linha de comandos não substitui uma variável indefinida por um texto vazio, por isso ^String é mantido literalmente. Considere que o ^ é tratado após % expansão variável. As variáveis %Skip% e %Keep% são expandidas como esperado, por isso a expressão resultante é SET Chars=%String:~1,3%.

Para provar isso, basta fazer SET String=something, Então o resultado é vai ser ...


Note que a sintaxe SET citada CALL SET "Chars=%^String:~%Skip%,%Keep%%" falha, porque isto esconde o carácter de escape ^ do analisador. No entanto, você pode usar aspas escapadas em vez disso:

CALL SET ^"Chars=%^String:~%Skip%,%Keep%%^"
 0
Author: aschipfl, 2017-06-13 22:19:48