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ê.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%%^"