2015-11-23 1 views
3

J'essaye de traiter plusieurs fichiers en les exécutant dans un fichier batch. Je veux que le fichier batch soit capable de prendre tous les fichiers qui lui sont donnés (alias jetés, ou glissés et déposés) et de les traiter.Création d'un fichier batch capable de traiter un glisser-déposer de plusieurs fichiers

Je peux actuellement traiter les fichiers individuellement avec la commande batch suivante:

"C:\Program Files\Wireshark\tshark.exe" -r %1 -Y "filter" -o "uat:user_dlts:\"User 8 (DLT=155)\",\"pxt\",\"0\",\"\",\"0\",\"\"" -o "gui.column.format:\"Info\",\"%%i\""> %1".filter.txt" 

Je cherche à faire la même chose que ci-dessus, mais avec la possibilité de simplement glisser-déposer les fichiers sur le fichier batch à traiter.

Pour ceux confus au sujet du fichier batch ci-dessus:
-r lit le fichier d'entrée, dont l'adresse de fichier complet (y compris l'extension) est capturé par% 1
-Y filtre certaines parties du fichier traîné & a chuté
-o Définit les préférences (définies par le "" s) pour l'exécution de l'exécutable: tshark.exe
-> redirige les résultats vers stdout
-% 1 ".filter.txt" affiche les résultats dans un nouveau fichier appelé "draggedfilename.filter.txt"

à partir de l'utilisation de ce code ailleurs que de m'aider avec ce code (en raison de l'application pour laquelle il est utilisé). J'ai changé plusieurs drapeaux dans cette version du code pour l'amour de la vie privée. Laissez-moi savoir si vous avez des questions!

+0

Ne le faites pas. Le glisser-déposer n'est pas implémenté correctement dans l'explorateur: les arguments de la ligne de commande sont rompus sur les caractères spéciaux (comme '&') qui sont valides dans les noms de fichiers entre guillemets (l'explorateur manque pour les citer). Mieux vaut investir votre temps dans une solution avec ['[vbscript]'] (https://stackoverflow.com/questions/tagged/vbscript) qui est principalement disponible où '.bat' et' .cmd' est ... – Wolf

Répondre

4

Vous pouvez opter pour une boucle en utilisant goto et shift comme celui-ci (voir rem commentaires détails):

:LOOP 
rem check first argument whether it is empty and quit loop in case; 
rem `%1` is the argument as is; `%~1` removes surrounding quotes; 
rem `"%~1"` therefore ensures that the argument is always enclosed within quotes: 
if "%~1"=="" goto :END 
rem the argument is passed over to the command to execute (`"%~1"`): 
"C:\Program Files\Wireshark\tshark.exe" -r "%~1" -Y "filter" -o "uat:user_dlts:\"User 8 (DLT=155)\",\"pxt\",\"0\",\"\",\"0\",\"\"" -o "gui.column.format:\"Info\",\"%%i\""> "%~1.filter.txt" 
rem `shift` makes the second argument (`%2`) to be the first (`%1`), the third (`%3`) to be the second (`%2`),...: 
shift 
rem go back to top: 
goto :LOOP 
:END 
+0

Cette méthode a fonctionné et le %% a &% * ne l'a pas fait. Merci pour l'aide. Les commentaires ont également aidé et clarifié ce dont j'avais besoin et ce qui se passait. J'inclurai probablement de meilleures versions des rems dans ma version pour la référence de programmation plus tard si nous devons faire plus de fichiers séquentiels comme ceci. – Midimistro

3

Utilisez %* au lieu de %1.

Exemple:

@echo off 

for %%a in (%*) do (
"C:\Program Files\Wireshark\tshark.exe" -r "%%a" -Y "filter" -o "uat:user_dlts:\"User 8 (DLT=155)\",\"pxt\",\"0\",\"\",\"0\",\"\"" -o "gui.column.format:\"Info\",\"%%i\""> "%%a"".filter.txt" 
) 

Remplacer %%i avec la variable droite.

+3

quelques notes. Tous les fichiers que vous déposez sur le fichier de commandes seront indiqués s'ils ont des espaces dans le chemin. De plus, si vous déposez suffisamment de fichiers sur le fichier de commandes qui ont des chemins vraiment longs, vous pouvez dépasser la limite de ligne. Il est 4096 dans XP et 8192 dans Windows 7. En outre, tous les noms de fichiers qui ont une esperluette en eux sans espace ne traiteront pas correctement. Une autre option pour traiter tous les arguments est aussi d'utiliser SHIFT, puis de vérifier si% 1 n'est pas vide et de revenir à une étiquette. Voici un lien vers le point de vue de Jeb sur la façon de le faire d'une manière différente. http://stackoverflow.com/a/5370380/1417694 – Squashman

+0

N'a pas fonctionné dans mon système. En ce qui concerne %% i, cela définit une variable dans tshark qui est utilisée pour filtrer certaines parties du fichier que je suis en train de jeter. %% i n'a aucun effet sur le fichier de commandes car il est entre guillemets. – Midimistro