2017-09-21 5 views
0

Comme certains le savent, je travaille sur un script pour collecter des informations sur un ordinateur pour accélérer le processus. Non, je suis coincé parce que je voulais écrire le résultat décodé dans un fichier texte sans le spammer avec de nouvelles lignes. Le problème est que dès que je veux faire ajouter le paramètre /p il s'arrête après le premier tour de décodage.La boucle est bloquée lors de l'utilisation de SET avec/P

@echo offsure 
set list=89 86 51 84 49 55 52 49 52 49 
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 
FOR %%X IN (%list%) DO (
    set /p temp=%%~nX 
    cmd /c exit !temp:~0,7! 
    set temp2=!=exitcodeAscii! 
    echo !temp2! 
) >> C:\TestConverters.txt 
Echo. >> C:\TestConverters.txt 
pause 

Voici le code source que j'utilise actuellement. Si je supprime le paramètre/p cela fonctionne parfaitement bien. Alors maintenant, je suis en train d'essayer d'améliorer le résultat du test que j'utilise dans le script pour avoir au moins ce petit truc déjà élaboré.

+3

Il est un peu ballonné, '%% X' =' %% ~ nX' = '! temp!' = '! temp: ~ 0,7!' – Compo

+0

@DodgyCodeException: il s'agit d'une variable interne non documentée, qui convertit errorlevel en ASCII (répertorié dans [SS64] (https://ss64.com/nt/syntax- variables.html)) – Stephan

Répondre

3

set /p temp=%%~nX demandera à l'utilisateur une variable nommée temp, présentant une invite de %%~nX. Probablement pas ce que tu veux.

Je suppose que vous voulez écrire !temp2! sans saut de ligne.
Oui il y a une astuce set /p pour le faire, mais a) vous l'avez utilisé au mauvais endroit et b) vous ne voulez pas que l'utilisateur entre quelque chose (qui mettra en pause votre script), mais prend la contribution de NUL à la place:

Remplacer

echo !temp2! 

avec

<nul set /p =!temp2! 

(et supprimer l'espace de fuite à la ligne précédente)

Après le commentaire de Compo, votre code peut être simplifié comme:

@echo off 
set list=89 86 51 84 49 55 52 49 52 49 
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 
(
    FOR %%X IN (%list%) DO (
    cmd /c exit %%X 
    <nul set /p =!=exitcodeAscii! 
) 
    echo. 
)>>C:\TestConverters.txt 
pause 
+0

Mec merci beaucoup. Maintenant, je n'aurai plus qu'à filtrer les informations telles qu'elles sont dans la "liste" de var et j'ai enfin terminé la configuration du script final. Vraiment mon pote merci beaucoup. Dites-moi si je pourrais faire quelque chose pour vous. Aussi belle explication. :-) –

0

Ou vous pouvez essayer.

@echo off 
set list=89 86 51 84 49 55 52 49 52 49 
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 
FOR %%X IN (%list%) DO (
set temp=%%~nX 
cmd /c exit !temp:~0,7! 
set temp2=!=exitcodeAscii! 
<nul set /p =!temp2! 
) >> C:\BACKUPS\TestConverters.txt 
Echo. >> C:\BACKUPS\TestConverters.txt 
pause 
1

Un exemple rapide, si vous n'avez pas vraiment besoin d'utiliser SET/P:

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "list=89 86 51 84 49 55 52 49 52 49" 
SET "variable=" 
FOR %%X IN (%list%) DO (CMD/C EXIT %%X 
    Set "variable=!variable!!=EXITCODEASCII!") 
IF DEFINED variable >"C:\TestConverters.txt" ECHO(%variable% 
PAUSE 
+0

probablement plus rapide à construire d'abord la ligne puis l'écrire en une fois que d'écrire chaque caractère avec la méthode 'set/p'. – Stephan

+0

ce n'est pas une question de vitesse mais de fonction. Si cela fonctionne parfaitement bien pour moi alors je suis heureux pour cela. Je n'aurai donc pas besoin de le faire plus vite. Il serait probablement seulement plus rapide de 1-10 ms ce qui n'est pas vraiment beaucoup. Ce n'est pas comme si je devais le faire pour 10 millions de lignes ou de valeurs. –

+0

@ M.Stephen, la vitesse n'est pas un problème, l'efficacité devrait cependant être, lorsque cela est possible. Stephans point aurait dû lire que ma suggestion était probablement plus efficace. J'ai d'abord commenté votre question, Stephan a basé sa réponse autour de mon commentaire, mais a laissé entendre que ma réponse ultérieure était probablement plus rapide. Vous avez décidé d'ignorer tout cela et d'accepter sa réponse à la place, qui est bien sûr votre perogative. Je ne vois aucun avantage à ce que vous argumentiez son point quatre jours plus tard, en dessous de ma réponse parfaitement bonne, tout en continuant à ignorer la contribution que j'ai faite! – Compo