Como você usa um arquivo em lotes para criar outro arquivo de lote que contenha% username%?

2

Eu tenho tentado fazer um arquivo de lote usando outro arquivo de lote.
O arquivo que eu quero fazer precisa conter %username% para que ele funcione em outros computadores também. Sempre que tento fazer isso, ele digita meu nome de usuário real no arquivo, o que impossibilita a execução em outros computadores. Alguém pode me ajudar com o meu problema?

Aqui está o que eu escrevi no arquivo de lote:

Echo cd c:\Users\%username%\Documents > x.bat

Mas quando eu abro o x.bat ele diz:

Echo cd c:\Users\myname\Documents

Eu realmente sei o que causa esse problema, mas não consegui encontrar uma maneira de superar isso.

    
por Ali Demir 22.06.2018 / 13:07

1 resposta

2

Algumas pessoas inteligentes examinaram o funcionamento interno dos arquivos em lote de processamento do cmd.exe neste stackoverflow.com Perguntas e respostas

Para escapar de um % , ele precisa ser duplicado. (o link acima mencionado explica que esta é uma etapa inicial desfeita pelo analisador de lote)

Se você definir e repetir repetidamente uma variável contendo % , será necessário duplicar todas as etapas envolvidas para atrasar a expansão % - > %% - > %%%% .

O problema relacionado delayedexpansion tem duas soluções.

  1. SetLocal EnableDelayedExpansion e uso de ! em vez de % .
    Isso é necessário quando você define e usa uma variável em um (bloco de código)
  2. Uso de uma pseudo chamada com comandos set ou echo forçar um segundo passe de avaliação.
    (para referenciar indiretamente uma variável, por exemplo)

Exemplos:

:: Q:\bar18\SU_1333415.cmd
@Echo off
( Echo cd c:\Users\%username%\Documents
  Echo random number %random%
) >x.bat 
Echo============x.bat=============
type x.bat
Echo=
( Echo cd c:\Users\%%username%%\Documents
  Echo random number %%random%%
) >y.bat 
Echo============y.bat=============
type y.bat
Echo=
Echo ========call echo============
Set bar=6
Set foo=bar
Call Echo foo = %foo%, %%foo%% = %%%foo%%%
Echo=
Echo =====delayed expansion !===
Setlocal EnableDelayedExpansion
Set bar=6
Set foo=bar
Echo foo = %foo%, !foo! = !%foo%!
Echo=
Echo =======(code block)==========
Set "Answer=n/a"
( Set /P "Answer=Enter a number: "
       Echo 1. the Answer is [%Answer%]
  Call Echo 2. the Answer is [%%Answer%%]
       Echo 3. the Answer is [!Answer!]
)
Echo==============================

Exemplo de saída:

20:07:57 Q:\Test18
> SU_1333415.cmd
===========x.bat=============
cd c:\Users\LotPings\Documents
random number 5680

===========y.bat=============
cd c:\Users\%username%\Documents
random number %random%

========call echo============
foo = bar, bar = 6

=====delayed expansion !===
foo = bar, bar = 6

=======(code block)==========
Enter a number: 11
1. the Answer is [n/a]
2. the Answer is [11]
3. the Answer is [11]
=============================
    
por 22.06.2018 / 20:10