[déplacé VB6 -> VB..NET] lancement d'une application vb dans l'invite de command

Résolu
vquiblier Messages postés 14 Date d'inscription mercredi 22 juillet 2009 Statut Membre Dernière intervention 2 avril 2010 - 30 juil. 2009 à 14:35
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 31 juil. 2009 à 15:42
Bonjour,
J'essaye de lancer mon projet vb dans une invite de commande.
Je tape ceci dans l''invite de commande
ConsoleApplication1.application D:\temp\share

Et là je recois un bon message d'erreur Windows qui me demande d'envoyer le rapport d'erreur car ConsoleApplication a cesser de fonctionner

Je ne comprend pas pourquoi quand je code en dur mon paramètres(D:\temp\share) dans mon module vb çà marche et pas avec l'invite de commande...

Si çà peut aider je donne le code de mon Main

Sub Main()
Dim fso As Scripting.FileSystemObject, dossier As Folder, dirtoParse As String
fso = CreateObject("Scripting.FileSystemObject")
dirtoParse = Command()
dossier = fso.GetFolder(dirtoParse)
scan(dossier)
End Sub

Si quelqu'un a une idéé...

J'ai tester aussi en débuggant et en mettant mon paramètres en tant qu'argument de la console çà fonctionne??

Ah oui je travaille avec Visual Basic 2008 Express

15 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 juil. 2009 à 17:51
command c'est en vb6
en vb.net si je ne dis pas de bétise c'est
My.Application.CommandLineArgs(X)



ma question "que contient dirtoparse" voulait dire : as-tu vérifié que la valeur attendue soit bien là, sans guillemet, etc...
on passe bien par la sub main, pas d'erreur (avant le freeze) etc... ?

enfin, FSO c'est du VBS (S pour SCRIPT)
c'était déjà moche en VB6 et VBA, mais en VB.NET c'est même totalement décalé puisque tu as tout dans system.io (.path, .file)
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 juil. 2009 à 11:23
bon, faut m'expliquer là...

tu récupères les arguments (tableau) dans une string au lieu d'un tableau?
et tu ne l'utilises même pas....

ensuite tu appelles une méthode public (pourquoi??) récursive avec un paramètre, qui est lui est un nom de variable public?
et dans la récursivité tu passes un argument non déclaré

çà ne veut rien dire!

1. supprime les références VB




2. force l'OPTION EXPLICIT




3. supprime la ligne Imports Scripting pour ne pas utiliser ce fichu FSO
il est très bien mais n'a pas sa place en VB.NET (ni même en VB6)


4. tu n'as rien à déclarer dans la partie accessible
déplace toutes tes variables dans la sub scan



et à partir de là (avec la tonne d'erreurs qui va apparaître) on pourra commencer à refaire tout au propre


++
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 juil. 2009 à 12:23
bon aller, c'est un essai (je n'ai pas testé DSO, je ne connais pas)

CODE INTéGRAL

'Imports Scripting '<- pas besoin
Module Module1

    Sub Main()
        If My.Application.CommandLineArgs.Count = 0 Then
            Console.WriteLine("Aucun argument n'a été passé en paramètre")
            Console.WriteLine("Appuyez sur la touche ENTER pour quitter...")
            Console.Read()
        Else
            'argument reçu (a du être passé entre guillemets)
            Dim strPath As String = My.Application.CommandLineArgs(0)
            Console.WriteLine("Démarrage de l'application avec l'argument suivant :" & Environment.NewLine)
            Console.WriteLine(strPath & Environment.NewLine)
            Console.WriteLine(String.Empty)

            'vérification chemin valide
            If System.IO.Directory.Exists(strPath) Then
                Console.WriteLine("Appuyez sur la touche ENTER pour commencer le traitement")
                Console.Read()
                Console.WriteLine("Démarrage du traitement...")
                ScanFolder(strPath)
                Console.WriteLine("*** Listing terminé avec succès ***")
            Else
                Console.WriteLine("L'argument passé n'est pas un chemin de dossier connu")
            End If
            Console.WriteLine("Appuyez sur la touche ENTER pour quitter...")
            Console.Read()
        End If
    End Sub

    Private Sub ScanFolder(ByRef strFolderPath As String)
        'on a donc ici un chemin de dossier valide, contenant 0 ou plusieurs fichiers, 0 ou plusieurs dossiers
        'on ne liste que les DOC avec récursivité sur la recherche
        For Each f As String In System.IO.Directory.GetFiles(strFolderPath, "*.doc", IO.SearchOption.AllDirectories)
            Dim DSO As New DSOFile.OleDocumentPropertiesClass
            DSO.Open(f)

            Console.WriteLine("Chemin du fichier : " & f)

            Dim strTitle As String = DSO.SummaryProperties.Title
            'applique le titre si vide
            If strTitle.Length = 0 Then
                strTitle = DSO.CustomProperties("TitreDoc").Value
                DSO.SummaryProperties.Title = strTitle
            End If
            Console.WriteLine("    Titre : " & strTitle)

            Dim strReference As String = DSO.CustomProperties("RéférenceDoc").Value
            Console.WriteLine("    Référence : " & strTitle)

            Dim strVersion As String = DSO.CustomProperties("VersionDoc").Value
            Console.WriteLine("    Version : " & strTitle)

            'applique la crée et version en sujet
            DSO.SummaryProperties.Subject = String.Format("VersionDoc: {0} ReferenceDoc: {1}", strVersion, strReference)
            DSO.Save()
            DSO.Close()
            DSO = Nothing
            Console.WriteLine("----------------------------------" & Environment.NewLine)
        Next f
    End Sub
End Module




[hr]
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 juil. 2009 à 14:34
me semble qu'avec les explications et le code tout cuit, tu peux t'en sortir sans mal non?

My.Application.CommandLineArgs(1) te renverra le chemin du fichier si ta syntaxe d'appel est bonne

My.Computer.FileSystem.ReadAllText te renverra la totalité de son contenu
boucle sur une liste, pourquoi pas, çà dépend de sa structure
tu peux aussi faire un simple tableau en découpant les retours chariot, par exemple.
ce qui donne :
Dim asArgs() As String = My.Computer.FileSystem.ReadAllText(My.Application.CommandLineArgs(1)).Split(Environment.NewLine.ToCharArray)

strTitle.Contains("atp") te renverra l'existance de ta chaine dans le titre du doc en cours d'analyse


ps : n'oublie pas de valider la ou les bonnes réponses par le bouton "réponse acceptée"

au travail!
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 juil. 2009 à 14:50
salut,

(topic déplacé)

vb2008... avec ce code mélange VBS et VB6 ?....

que retourne dirtoparse (même pas déclarée) ??

et la commande, tu la lances depuis la racine de ton ../BIN ?

[hr]
0
vquiblier Messages postés 14 Date d'inscription mercredi 22 juillet 2009 Statut Membre Dernière intervention 2 avril 2010
30 juil. 2009 à 16:39
Bonjour PCPT,

dirtoParse est le paramètres que je passe à ConsoleApplication1 que je lance depuis une invite de commande.
Je le lance depuis d:\projet qui est le chemin où j'ai publié mon projet ConsoleApplication1

dirtoParse est d:\temp\share qui est un fait un dossier que je parcours grâce à la fonction scandir(dirtoParse) pour pouvoir ensuite traiter les fichiers contenus à l'intérieur

Je récupère mon dirtoParse grâce à dirtoParse=Command()

si ce n'est pas la bonne façon de faire donne moi une meilleure solution çà me sarai fort utile.

Merci de m'aider.
0
vquiblier Messages postés 14 Date d'inscription mercredi 22 juillet 2009 Statut Membre Dernière intervention 2 avril 2010
30 juil. 2009 à 16:56
J'ai pu voir le message qui s'affiche dans la fenêtre d'execution et çà me dit:
Une exception de première chance de type 'System.Runtime.InteropSources.COMException' s'est produite dans ConsoleApplication1.exe
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
30 juil. 2009 à 23:39
Et là je recois un bon message d'erreur Windows qui me demande d'envoyer le rapport d'erreur car ConsoleApplication a cesser de fonctionner


Tu as une erreur dans ton sub Main, elle inclu l'appel vers le sub scan, vérifie celui-ci et implémente une gestion des erreur (Try/Catch). Cette erreur peut survenir lors d'une IOException, à cause de l'accès refusé vers un répertoire ou un fichier.

Suis les conseils PCPT, remplace tous les appelles au FileSystemObject qui sont du VB6 par une gestion de System.IO qui est du natif Framework, cela évitera que ton application soit dépendante de scrrun.dll.

Si tu souhaite un coup de main pour cette modif, post le contenu de ton sub scan.

@+ Mayzz.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
vquiblier Messages postés 14 Date d'inscription mercredi 22 juillet 2009 Statut Membre Dernière intervention 2 avril 2010
31 juil. 2009 à 08:39
Bonjour PCPT,

Voilà je te donne l'intégralité du code de mon module si çà peut t'aider,
dedans tu verras l'appel à DSOFile (si tu connais pas c'est une librairie qui permet d'accéder au propriétés personnalisées des Document Office)
Je continue à chercher de mon cotés si t'as des solutions n'hésite pas à m'en faire part.

Imports System.IO
Imports Scripting

Module Module1
Dim Title As String
Dim TitreDoc As String
Dim Reference As String
Dim Version As String
Dim DSO As DSOFile.OleDocumentPropertiesClass
Dim fso As System.Object
Dim dossier As Folder
Dim ssdossier As Folder


Public Sub scan(ByVal dossier As Folder)
Dim fichier As Scripting.File
For Each fichier In dossier.Files
DSO = New DSOFile.OleDocumentPropertiesClass
DSO.Open(fichier.Path)

If InStr(fichier.Name, ".doc") > 0 Then
Title = DSO.SummaryProperties.Title

If (Title = String.Empty) Then
TitreDoc = DSO.CustomProperties("TitreDoc").Value
DSO.SummaryProperties.Title = TitreDoc
End If

Reference = DSO.CustomProperties("RéférenceDoc").Value
Version = DSO.CustomProperties("VersionDoc").Value
DSO.SummaryProperties.Subject = "VersionDoc: " & Version & " ReferenceDoc: " & Reference

End If

DSO.Save()
DSO.Close()
TitreDoc = ""
Reference = ""
Version = ""

Next

For Each sousdossier In dossier.SubFolders
scan(sousdossier)

Next


End Sub




Sub Main()
Dim fso As Scripting.FileSystemObject, dossier As Folder, dirtoParse As String
fso = CreateObject("Scripting.FileSystemObject")
dirtoParse = Command()
dossier = fso.GetFolder("D:\temp\Alfresco")
scan(dossier)
End Sub

End Module

Merci en tout cas pour ton aide.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 juil. 2009 à 12:26
oups pour le copier/coller, vous aurez corrigez vous-même :

Console.WriteLine(" Référence : " & strTitle)
Console.WriteLine(" Référence : " & strReference)

Console.WriteLine(" Version : " & strTitle)
Console.WriteLine(" Version : " & strVersion)
0
vquiblier Messages postés 14 Date d'inscription mercredi 22 juillet 2009 Statut Membre Dernière intervention 2 avril 2010
31 juil. 2009 à 14:19
Bonjour PCPT,

Un grand merci pour tes explication, elle m'ont été forte utile, maintenant dans la deuxième étape j'aimerais passer en paramètres du main un fichier texte qui contient des chaines de caractères que je voudrais filtrer par exemple ne changer que les titres des fonctions qui contiennent la chaine "atp" dans leur nom.
J'avais penser lire le fichier en extraire une ArrayList de String puis boucler sur cette liste
Du coup comme t'as pu le deviner...
Du coup si tu as des pistes....

Merci.
0
vquiblier Messages postés 14 Date d'inscription mercredi 22 juillet 2009 Statut Membre Dernière intervention 2 avril 2010
31 juil. 2009 à 14:54
Désolé de te redéranger pour si peu
Mais comment donner mon paramètre dans la fenètre de comande
je tape:
ConsoleApplication2.application "D:\temp\Share"
et je suis pourtant placer dans le repertoire où j'ai publier mon projet

Merci.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 juil. 2009 à 15:04
pour tester j'ai créé la même arborescence que toi (D:\temp\Share)

j'ai placé un run.bat dans mon dossier ConsoleApplication1\bin\Debug

son contenu est :
ConsoleApplication1.exe "D:\temp\Share" "C:\fichier_d_arguments.txt"
0
vquiblier Messages postés 14 Date d'inscription mercredi 22 juillet 2009 Statut Membre Dernière intervention 2 avril 2010
31 juil. 2009 à 15:20
Salut,

Désolé mais je n'ai pas cette hiérarchie de fichier dans mon projet publiéé
J'ai un setup.exe, un ConsoleApplication2.application

et ensuite un sous-dossier ApplicationFiles dans lequel il y en un autre
ou j'ai dso.dll.deploy; ConsoleApplication2.exe.deploy

j'ai enlevé les deploy et çà à marcher, par contre je craint que pour l'installation sur un nouveau poste il faudra remmettre les deploy

Si t'as une meillleure solution

Merci.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 juil. 2009 à 15:42
pour tester


je ne me suis pas amusé à faire un installeur (publication) pour faire quelques lignes de code

je parle de l'arborescence de mes dossiers, et non de celle de la fenêtre d'exploration du projet

tu n'as qu'à faire un raccourci de ton exe sur le bureau et modifier les paramètres du raccourci
0
Rejoignez-nous