web-dev-qa-db-fra.com

Autorisation refusée sur CopyFile dans VBS

J'essaie d'automatiser le transfert d'un fichier dans les répertoires personnels de mes utilisateurs, mais je suis bloqué par une erreur "Permission Denied" (autorisation refusée). Cette option est renvoyée à la ligne 6 avec l'appel de CopyFile.

Il existe d'autres parties du script (non illustrées) qui créent et copient le contenu d'un dossier à l'aide des mêmes répertoires source et cible et fonctionnent parfaitement. Ce n'est que lorsque j'utilise CopyFile qu'il échoue.

dim fso

set fso = CreateObject("Scripting.FileSystemObject")

if not fso.FileExists("H:\Minecraft\.minecraft\options.txt") then
        fso.CopyFile "C:\Minecraft\options.txt", "H:\Minecraft\.minecraft\"
end if

set fso = nothing

H: est un répertoire de base du réseau dans lequel l'utilisateur actuel dispose de droits lecture/écriture complets.

J'ai essayé d'ajouter/de supprimer les barres obliques de fin des chemins, en ajoutant "options.txt" au chemin de destination, en supprimant l'argument false ... Vous ne savez pas quoi essayer d'autre. Des pensées?

Merci!

Pour info, ce morceau de code, qui vient juste avant le bit sujette aux erreurs ci-dessus, s'exécute parfaitement à chaque fois:

if not fso.FolderExists("H:\Minecraft\.minecraft\bin\") then
    if not fso.FolderExists("H:\Minecraft\.minecraft\") then
        fso.CreateFolder("H:\Minecraft\.minecraft\")
    end if
    fso.GetFolder("C:\Minecraft\bin\").Copy "H:\Minecraft\.minecraft\"
end if
22
Triz

Je n'ai jamais vu que CopyFile échouer avec une erreur "autorisation refusée" dans l'un de ces 3 scénarios:

  • Un problème de permission réel avec la source ou la destination.
  • Le chemin de destination est un dossier, mais ne comporte pas de barre oblique inversée.
  • Le fichier source est verrouillé par une application.
79
Ansgar Wiechers

pour moi, ajouter / a travaillé à la fin de l'emplacement du dossier . Par conséquent, si vous copiez dans un dossier, n'oubliez pas de mettre /

3
Surabhi Sugandha

Une autre chose à vérifier est de savoir si des applications ont toujours un blocage sur le fichier.

Eu quelques problèmes avec MoveFile. Une partie de mon problème d'autorisations était que mon script ouvre le fichier (dans ce cas dans Excel), apporte une modification, le ferme, puis le déplace dans un dossier "traité".

Lors du débogage de plusieurs choses, le script s'est écrasé plusieurs fois. En fouillant dans l'erreur d'autorisation refusée, j'ai constaté que 4 instances d'Excel s'exécutaient en arrière-plan, car le script n'avait jamais pu mettre correctement fin à l'application en raison de ces blocages. Apparemment, l'un d'entre eux était toujours en possession du dossier et, par conséquent, "autorisation refusée".

1
CargoPantsMan

Basé sur votre variable source (sourcePath = "C:\Minecraft\bin\"), je soupçonne que votre code dur pointe au mauvais endroit 

fso.CopyFile "C:\Minecraft\options.txt", destinationPath, false

devrait être

fso.CopyFile "C:\Minecraft\bin\options.txt", destinationPath

ou

fso.CopyFile sourcePath & "options.txt", destinationPath
0
Dave

Pour moi, seuls 7 à 9 appels sur MoveFolder sur 10 ont abouti. De plus, chaque fois que je relançais le test, ce serait un dossier différent qui échouait.

J'avais des barres obliques sur mon chemin, alors ce n'était pas mon problème. 

J'avais fermé tous les fichiers Excel ouverts dans le dossier, alors ce n'était pas mon problème.

Alors j'ai alors essayé de résoudre mon problème en plaçant un DoEvents et Application.Wait (DateAdd ("S", 1 #, maintenant)) entre les appels WorkBook.Close et FSO.MoveFolder.

Cela a rendu les choses meilleures mais toujours pas parfait.

Ce que j'ai fait pour résoudre ce problème a été de placer l'appel du dossier de déménagement dans une boucle jusqu'à ce que cela fonctionne. Ce qui est généralement sur le premier et parfois sur le deuxième appel. Je n'ai pas vu échouer toutes les dix tentatives de ma boucle de déplacement de force!

Dans le monde des fonctions asynchrones cachées, vous devez donner un peu de temps pour que ce qui est proche se soit réellement passé à tous les niveaux!

0
user2715390

Tu peux le faire:

fso.CopyFile "C:\Minecraft\options.txt", "H:\Minecraft\.minecraft\options.txt"

Incluez le nom de fichier dans le dossier dans lequel vous copiez.

0
Tanner Clark

J'ai lu votre problème, et j'ai eu le même problème. Mais après en avoir changé quelques-uns, mon problème "Permission Denied" est résolu.

Private Sub Addi_Click()
'On Error Resume Next
'call ds
browsers ("false")
Call makeAdir
ffgg = "C:\Users\Backups\user\" & User & "1\data\"
Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.Getfolder("c:\users\Backups\user\" & User & "1\data")
    f.Attributes = 0
Set fso = VBA.CreateObject("Scripting.FileSystemObject")
Call fso.Copyfile(filetarget, ffgg, True)

Regardez ffgg = "C:\Users\Backups\user\" & User & "1\data\", avant que je change, c'était ffgg = "C:\Users\Backups\user\" & User & "1\data" Quand j'ajoute une barre oblique inverse après "\data\", mon problème est résolu Essayez de rajouter une barre oblique. Peut-être résolu votre problème. Bonne chance.

0
HzzKyGcs