Comment utilisez-vous un fichier batch pour créer un autre fichier batch contenant% username%


2

J'ai essayé de créer un fichier de commandes à l'aide d'un autre fichier de commandes.
Le fichier que je veux créer doit contenir %username%pour pouvoir fonctionner également sur d'autres ordinateurs.
Chaque fois que j'essaie de le faire, il tape mon nom d'utilisateur actuel dans le fichier, ce qui rend impossible l'exécution sur d'autres ordinateurs. Quelqu'un peut-il m'aider s'il vous plaît avec mon problème?

Voici ce que j'ai écrit dans le fichier de commandes:

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

Mais quand j'ouvre x.bat, il dit:

Echo cd c:\Users\myname\Documents

En fait, je sais ce qui cause ce problème, mais je n’ai trouvé aucun moyen de le surmonter.


1
Pour éviter une expansion instantanée, doublez le nombre de signes de pourcentage suivants dans le lot générateur.%%USERNAME%%
LotPings

Est-ce que la même chose s'applique pour% random%?
Ali Demir

Oui, joindre de la même façon%%random%%
LotPings le

%est le caractère d'échappement dans le fichier de commandes. Utilisez %%au lieu d'un %. Plus de détails .
Sandeep

1
@ Lotings, pourquoi ne pas développer votre commentaire légèrement comme une réponse , car il résout le problème avec succès.
DrMoishe Pippik

Réponses:


2

Certaines personnes intelligentes ont examiné le fonctionnement interne de cmd.exe traitant des fichiers de commandes dans ce Q & A de stackoverflow.com .

Pour échapper à un, %il doit être doublé
(le lien mentionné ci-dessus explique qu'il s'agit d'une étape annulée au début par l'analyseur de lot).

Si vous définissez et faites écho à plusieurs reprises une variable contenant un, %vous devrez redoubler les étapes pour retarder l'expansion %-> %%-> %%%%.

La question connexe delayedexpansiona deux solutions.

  1. Setlocal EnableDelayedExpansion et utilisation de !au lieu de %.
    Ceci est requis lorsque vous définissez et utilisez une variable dans un (bloc de code)
  2. Utilisation d'un pseudo appel avec des commandes set ou echo pour forcer une 2e passe d'évaluation.
    (pour référencer indirectement une variable par exemple)

Exemples:

:: Q:\bar\2018\06\22\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==============================

Exemple de sortie:

20:07:57 Q:\Test\2018\06\22
> 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]
=============================
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.