2017-09-01 4 views
0

J'écris un programme qui utilise la commande "tracert" pour trouver les traceroutes pour les adresses IP, que je vais ensuite utiliser pour faire certaines choses. Comment j'ai prévu de faire ceci est, en rejetant la sortie pour toutes les adresses IP dans un fichier texte en ajoutant >>output.txt puis en le lisant avec Python ou quelque chose et le transformer en quelque chose d'utilisable. Mon problème avec ceci est que tracert montre aussi dans sa sortie certaines choses qui ne me servent à rien, comme la première ligne qui indique où il trace et quel est le nombre maximum de sauts, ou la dernière ligne cela dit seulement: "Trace complete". Le fait est que je vais traquer plus de 3500 adresses IP, et que ce nombre ne fera qu'augmenter, donc c'est beaucoup de texte que j'imprime dans un fichier qui est absolument inutile.Existe-t-il un moyen de modifier la sortie de la ligne de commande avant de l'enregistrer dans un fichier?

Voilà pourquoi ma question est la suivante: est-il possible de modifier la sortie de la commande avant de l'enregistrer, dans un fichier batch?

La commande Je cours:

tracert -h 30 -w 500 XX.XXX.XXX.XX >>cmd_output.txt 

La sortie donne:

Tracing route to XYZ.net 
[XX.XXX.XXX.XX] 
over a maximum of 30 hops: 

    1 41 ms 18 ms  2 ms text.net [XXX.XXX.XXX.X] 
    2  2 ms  1 ms  1 ms text.net [XX.XXX.XXX.XXX] 
    3  1 ms  1 ms  1 ms text.net [XX.XXX.XXX.XXX] 
    4  5 ms  5 ms  5 ms text.net [XXX.XX.XX.XXX] 
    5  5 ms  5 ms  5 ms text.net [XXX.XX.XX.X] 
    6 25 ms 25 ms 25 ms XYZ.net [XX.XXX.XXX.XX] 

Trace complete. 
+3

façon la plus simple: 'tracert www.google.com | trouver "ms" >> file.txt' ou' tracert www.google.com || findstr/bc: "" '(n'imprime que les lignes qui commencent par un espace) – Stephan

+1

Vous nous avez dit ce que vous considérez comme inutile, mais pas ce que vous voulez réellement dans votre sortie. Pour moi, je ne vois aucun but dans toutes les colonnes non plus. S'il vous plaît laissez-nous savoir ce que vous voulez tout en recherchant comment le faire vous-même parce que ce n'est pas un site de demande de codage. – Compo

+1

La question est: __Est-ce que je peux modifier la sortie du CMD avant de l'enregistrer dans un fichier batch? __ Et la réponse est: __Oui, il y a plusieurs façons de filtrer ou reformater une sortie d'application avant d'écrire dans un fichier .__ Nous n'aurions pas besoin d'écrire plus, mais [Stephan] (https://stackoverflow.com/users/2152082/stephan) suggérait déjà l'utilisation de __FINDSTR__. __FIND__ pourrait être aussi utilisé comme application de filtre. Il est également possible d'utiliser __FOR__, __SET__ et __IF__ pour reformater la sortie avant d'écrire dans un fichier. Et il y a beaucoup plus de méthodes. Exécutez-les avec '/?' Pour obtenir de l'aide. – Mofi

Répondre

0

La formule exacte pour sauter les N premières lignes de la sortie une commande est:

for /f "skip=N tokens=*" %a in ('<command>') do @echo %a 

Dans votre cas:

for /f "skip=4 tokens=*" %a in ('tracert -h 30 -w 500 XX.XXX.XXX.XX ') do @echo %a >> cmd_output.txt 
0

Utilisation de vos réponses et quelques autres recherches, je suis venu avec cette solution:

@echo off 
rem token 1 is hop-number 
rem token 6,7 or 8 may be IP, depending on whether 2 or less requests dont receive a response. 
for /f "tokens=1,6,7,8 delims=* " %%a in ('tracert -d -h 30 -w 350 8.8.8.8^|findstr /bc:" " ') do (
    echo %%a, %%b, %%c, %%d 
)>>ips.txt 
endlocal 

Cela donne la réponse suivante:

1, <1, ms, 192.168.1.240 
2, 1, ms, 195.114.237.65 
3, 1, ms, 94.247.72.33 
4, <1, ms, 82.150.154.129 
5, 1, ms, 217.170.0.244 
6, 2, ms, 193.239.117.142 
7, 2, ms, 108.170.241.140 
8, 2, ms, 216.239.41.49 
9, 5, ms, 74.125.37.130 
10, 209.85.243.253, , 
11, 5, ms, 108.170.237.135 
12, , , 
13, 5, ms, 8.8.8.8 

Dans chaque ligne, avant la première virgule est toujours le numéro de saut. Ensuite, l'adresse IP peut être après la première, la deuxième ou la troisième virgule. Puisque tracert envoie trois requêtes par saut, une ou deux de ces requêtes peuvent échouer. Si une requête échoue, le résultat est "*", au lieu de "X ms" et parce que je délimite avec des espaces, si je prendrais toujours le 8ème jeton, il pourrait ne pas contenir l'adresse IP, ou quoi que ce soit d'ailleurs.

Ce code contiendra toujours l'adresse IP, mais contiendra toujours des données superflues si moins de deux demandes ont échoué, car alors le jeton 6 et ou 7 contiendra une partie de "X ms". Dans la réponse, vous verrez que toutes les demandes ont abouti, sauf pour le saut 10, où deux demandes ont échoué et le saut 12, où trois demandes ont échoué et que tracert n'a pas réussi à renvoyer une adresse IP.

Si quelqu'un a des idées brillantes sur la façon d'enlever ces derniers bits de données superflues, il serait apprécié. Sinon, c'est une sortie parfaitement réalisable pour moi. Alors merci pour votre aide!:)

0
@echo off 
setlocal enabledelayedexpansion 
for /f "tokens=1,*" %%a in ('tracert -d -h 30 -w 350 8.8.8.8 ^|findstr /bc:" "') do (
    for %%c in (%%b) do set ip=%%c 
    set ip=!ip:[=! 
    set ip=!ip:]=! 
    echo !ip!|findstr "[0-9]" >nul || set "ip=-" 
    echo %%a, !ip! 
) 

la deuxième for (%%c) obtient le dernier mot de la ligne (qui est soit une adresse IP ou une adresse IP entre parenthèses ou le dernier mot de « demande a expiré. » (out. en English version Windows). le reste des lignes est juste pour embellir le résultat (la suppression des crochets, en remplaçant tout ce qui n'a pas de numéro (pas d'adresse IP) avec un -

Peut-être que vous voulez remplacer les deux echo ... lignes avec juste :

echo !ip!|findstr "[0-9]" >nul && echo %%a, !ip! 

Ceci ne produirait pas de lignes sans adresse IP.

Pour la && et || thingy, voir SS64

Pour la syntaxe !variable! voir delayed expansion

+0

C'est adorable et juste ce dont j'ai besoin, merci! –