4

J'ai un script qui obtient des informations sur les dossiers et sous-dossiers actuels dans un répertoire spécifique. Il fonctionne très bien, mais je suis tombé sur un problème étrange:Impossible de trouver le répertoire VBS - 'Chemin introuvable'

dim FSO, objFolder, datafolder, foldername, objSubfolder, totalSize 
dim objSubfolder2, objFolder2, mSize, size, today, dateLastMod 

foldername = "D:\folder\subfolder" 
set FSO = CreateObject("Scripting.FileSystemObject") 
set objFolder = FSO.GetFolder(foldername) 
set colSubfolders = objFolder.Subfolders 
today = Now 
ShowFolderDetails objFolder 

Function ShowFolderDetails(oF) 

    datafolder = oF.Size/1073741824 
    wscript.echo oF.Name & " :Size= " & datafolder & " GB" 
    wscript.echo oF.Name & " #Files= " & oF.Files.Count 
    wscript.echo oF.Name & " #Folders= " & oF.Subfolders.count 
    wscript.echo oF.Name & " Date Last Modified= " & oF.DateLastModified 
    totalSize = totalSize + datafolder 

end Function 

Et il y a plus à suivre, mais mon problème est que je reçois un path not found quand j'appelle cette fonction.

Le dossier ne se trouve pas sur le lecteur C: \, ce qui ne devrait pas poser de problème. J'ai fait ce même script mais j'ai changé foldername = D:\folder\differentsubfolder ce qui fonctionne parfaitement. Mais quand je le change dans l'autre dossier, il me donne un chemin d'accès introuvable.

J'ai aussi essayé de mettre tout ci-dessous détaillent FSO = CreatObject ("Scripting.FileSytemObject") dans une instruction IF:

IF FSO.FolderExists (foldername) Alors ....

Ce ne entrer dans cette déclaration IF, ce qui me fait croire que le VBS le voit, mais je reçois toujours cette erreur à line 17 (datafolder = oF.Size/1073741824).

J'ai essayé de mettre dans le chemin complet du dossier où se trouve la variable nom de fichier (entourée de guillemets).

J'ai essayé d'exécuter mes vbs pointés vers d'autres répertoires et il fonctionne à 100%. C'est juste ce dossier spécifique. Il n'y a pas d'espaces dans le nom du dossier. Y at-il autre chose qui me manque? J'ai un accès administrateur complet à la D: \

+0

ce qui se passe si vous remarquez la ligne « datafolder = oF.Size/1073741824 »? Je suppose que c'est avec le useraccount de l'utilisateur que le script s'exécute? pas de problème de sécurité? – peter

+0

Bon point: c'est le problème. Il ne peut pas obtenir la taille de ce dossier ... toujours le débogage. (non cela ne devrait pas être un problème de sécurité, comme indiqué ci-dessus je cours dans l'administration locale) –

+0

euh, oui c'est possible, faites-vous une cartographie à un driveletter avec un nom d'utilisateur/mot de passe en premier? Si vous accédez aux dossiers ou aux fichiers par la suite, vous pouvez avoir des problèmes de sécurité, mais en devinant à partir de votre question, je pense que c'est une carte sur le lecteur d:? pourquoi ne pas publier son vrai nom? – peter

Répondre

2

Je parie que ce n'est pas un fichier caché ou un dossier qui est la cause, mais un fichier système comme par exemple Thumbs.db se trouve dans de nombreux les dossiers contenant des images, voir aussi les modifier les options de votre dossier pour voir les fichiers système, supprimez le fichier système et réessayez. Lorsque vous demandez la taille d'un dossier, vous devez accéder à TOUS les dossiers et fichiers en dessous. Si vous essayez votre script sur votre profil par exemple, vous obtiendrez certainement des erreurs, administrateur ou propriétaire de ce dossier ou non.

Dans le cas où il pourrait aider, voici un script qui donne les attributs d'un fichier

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.GetFile("c:\ruby193.zip") 
If objFile.Attributes AND 0 Then 
    Wscript.Echo "No attributes set." 
End If  
If objFile.Attributes AND 1 Then 
    Wscript.Echo "Read-only." 
End If  
If objFile.Attributes AND 2 Then 
    Wscript.Echo "Hidden file." 
End If  
If objFile.Attributes AND 4 Then 
    Wscript.Echo "System file." 
End If  
If objFile.Attributes AND 32 Then 
    Wscript.Echo "Archive bit set." 
End If  
If objFile.Attributes AND 64 Then 
    Wscript.Echo "Link or shortcut." 
End If  
If objFile.Attributes AND 2048 Then 
    Wscript.Echo "Compressed file." 
End If 
+0

Hmm. Je sais que c'est une mauvaise pratique mais j'ai corrigé ces erreurs avec un ** SUR ERREUR RESUME **. Après avoir soigneusement analysé mes dossiers et les informations retournées - mon script fonctionne - mais j'ai remarqué une différence minime entre la taille et la taille sur le disque (je recherche des dossiers avec des données dans le GB + change (MB) ne se soucient pas de). –

+0

alors, quelle était la raison du chemin du message introuvable? – peter

+0

@peter - J'accepte votre pari; voir ma réponse mise à jour. –

1

La propriété .Size d'un dossier est calculée à la volée. Ainsi, toutes les branches et les feuilles de cet arbre secondaire sont essentielles au succès de l'opération. Mon C: \ contient un dossier système caché « Volume Information System » que je peux obtenir le .Nom mais pas .Size de:

>> sFP = "System Volume Information" 
>> If goFS.FolderExists(sFP) Then WScript.Echo goFS.GetFolder(sFP).Name 
>> 
System Volume Information 
>> If goFS.FolderExists(sFP) Then WScript.Echo goFS.GetFolder(sFP).Size 
>> 
Error Number:  70 
Error Description: Permission denied 

J'avoue que « Autorisation refusée » n'est pas « chemin introuvable », mais il semble probable que les attributs ou les permissions de certains sous-dossiers soient à blâmer.

MISE À JOUR

Pour le test, j'ai demandé ma racine de gâcher un dossier sur ma part de linux qui est mis en correspondance comme e: \ bin. root voit:

bin 
[-rwx------ eh   16] bin/dragit-ssh.sh 
[lrwxrwxrwx eh   33] bin/komodo -> /home/eh/Komodo-Edit-6/bin/komodo 
[drwxr-xr-x eh  4.0K] bin/pics 
[-rwxr--r-- eh  6.0K] bin/pics/Thumbs.db 
[-rwxr--r-- eh  20K] bin/pics/jsa.JPG 
[-rwx------ root  10K] bin/pics/x 
[-rwxr-xr-x eh   45] bin/rhinos.sh 
[drwx------ root  4.0K] bin/rootsown 
[-rwxr-xr-x root  10K] bin/rootsown/x 
[-rwx------ eh  523] bin/showpath.sh 
[-rwxr--r-- eh  325] bin/sp6p.sh 

2 directories, 9 files 

14392 /home/eh/bin/rootsown 
40595 /home/eh/bin/pics 
60025 /home/eh/bin 

Sur linux, je suis autorisé à voir:

bin 
[-rwx------ eh   16] bin/dragit-ssh.sh 
[lrwxrwxrwx eh   33] bin/komodo -> /home/eh/Komodo-Edit-6/bin/komodo 
[drwxr-xr-x eh  4.0K] bin/pics 
[-rwxr--r-- eh  6.0K] bin/pics/Thumbs.db 
[-rwxr--r-- eh  20K] bin/pics/jsa.JPG 
[-rwx------ root  10K] bin/pics/x 
[-rwxr-xr-x eh   45] bin/rhinos.sh 
[drwx------ root  4.0K] bin/rootsown [error opening dir] 
[-rwx------ eh  523] bin/showpath.sh 
[-rwxr--r-- eh  325] bin/sp6p.sh 

2 directories, 8 files 

4096 bin/rootsown 
40595 bin/pics 
49729 bin 

Deux faits importants: Je ne suis pas autorisé à 'regarder dans' le répertoire rootsown, donc je peux » t voir ou taille bin/rootsown/x; mais la taille de bin/pics/x n'est pas un secret, bien qu'il m'ait été interdit de le lire, de le modifier ou de l'exécuter.

VBScript:

>> sf = "e:\bin\pics" 
>> WScript.Echo goFS.GetFolder(sf).Size 
>> 
36499 

Vous pouvez obtenir le .Size du dossier contenant des fichiers désagréables.

>> sf = "e:\bin" 
>> WScript.Echo goFS.GetFolder(sf).Size 
>> 
Error Number:  70 
Error Description: Permission denied 

Vous ne pouvez pas obtenir le format .Size d'un dossier contenant un sous-dossier (sub ...) méchant.

>> sf = "e:\bin\pics\rootsown" 
>> WScript.Echo goFS.GetFolder(sf).Size 
>> 
Error Number:  76 
Error Description: Path not found 

vous obtenez un « chemin introuvable » erreur, lorsque vous demandez l'.Size d'un dossier méchant

Sur cette base, je suis prêt à prendre le pari de Peter. Si vous pouvez montrer que en changeant les attributs ou les permissions d'un fichier vous pouvez faire que le parent du dossier réussisse. échouer, je vais payer 10 euros, - à la prochaine sans-abri Je me rencontre.

L'humble dir:

Pour obtenir la taille d'un dossier, je voudrais d'abord essayer

dir /s e:\bin 
Volume in drive E is eh 
Volume Serial Number is 0ED6-233C 

Directory of e:\bin 

4.06.2012 18:42 <DIR>   . 
4.06.2012 08:04 <DIR>   .. 
2.01.2012 12:21    45 rhinos.sh 
3.06.2012 22:55 <DIR>   rootsown 
3.10.2011 16:42    325 sp6p.sh 
4.06.2012 19:46 <DIR>   pics 
1.07.2010 23:34    523 showpath.sh 
8.10.2010 16:57    582 komodo 
4.05.2010 12:53    16 dragit-ssh.sh 
       5 File(s)   1.491 bytes 

Directory of e:\bin\pics 

4.06.2012 19:46 <DIR>   . 
4.06.2012 18:42 <DIR>   .. 
5.08.2011 10:22   10.296 x 
0.07.2008 03:44    6.144 Thumbs.db 
9.06.2012 23:29   20.059 jsa.JPG 
       3 File(s)   36.499 bytes 

    Total Files Listed: 
       8 File(s)   37.990 bytes 
       6 Dir(s) 29.060.050.944 bytes free 

Il semble que dir sait ce que je suis autorisé à connaître et qu'il n » t indûment perturbé par des dossiers méchants.

Un script qui utilise dir:

Option Explicit 

Dim reX : Set reX = New RegExp 
reX.Pattern = "Directory\s+of\s+(.+?)\r[\s\S]+?Total[\s\S]+?([.\d]+\sbytes)" 
Dim oMTS : Set oMTS = reX.Execute(WScript.StdIn.ReadAll()) 
If 1 = oMTS.Count Then 
    WScript.Echo "Size of", oMTS(0).SubMatches(0), "=>", oMTS(0).SubMatches(1) 
Else 
    WScript.Echo "Bingo!" 
End If 

échantillon utilisé:

dir /s e:\bin | cscript folsiz2.vbs 
Size of e:\bin => 37.990 bytes 

Le modèle RegExp pour SEARCHs

Directory\s+of\s+   The first "Directory of " 
(.+?)      capture the path of the folder, that is 
          the sequence of 'everything except \n' but non greedy, so 
\r       the first \r will not be included in the capture 
[\s\S]+?      non greedy sequence of 'really everything (space or non-space)' 
Total      until "Total" is found 
[\s\S]+?      advance but stop for the first 
([.\d]+\sbytes)    sequence of . or digits followed by " bytes", capture 
          that because that is the first sum after Total 
+0

Cela a certainement aidé mon débogage +1 en tant que .Size est mon problème à tous les niveaux. J'ai changé mes options de dossiers pour voir les fichiers cachés, trouvé une chose - en toute sécurité supprimé (car il n'a pas d'importance pour le répertoire), essayé à nouveau et pas de chance. Toujours déboguer –

+0

Puis-je avoir .Size ignore les fichiers cachés? –

+0

@Foxtrot - oui, dir le fait automatiquement. Ma mise à jour contient un script qui utilise dir pour obtenir la taille d'un dossier méchant. –

Questions connexes