3 votes

Obtention d'un message "Accès refusé" lors du déplacement d'un dossier vers un lien symbolique qui pointe vers un autre lecteur

J'ai un lecteur nommé D et un lecteur nommé E. J'ai créé un dossier nommé "test" dans le lecteur D et un dossier nommé "destination" dans le lecteur E en utilisant la commande mkdir. Ensuite, j'ai créé un lien symbolique sur le lecteur D à l'aide de la commande suivante :

mklink /D D:\source E:\destination

Maintenant, lorsque j'essaie de déplacer le dossier "test" de D vers D:\source en utilisant la commande move D:\test D:\source Si j'essaie de déplacer un fichier, j'obtiens un message d'erreur disant simplement "L'accès est refusé". Si j'essaie de déplacer un fichier nommé "test.txt" avec la commande move D:\test.txt D:\source Je n'obtiens pas d'erreur et le fichier est déplacé vers E:\destination avec succès.

J'ai également essayé de le faire dans powershell avec la commande mv D:\test\ D:\source\ et j'ai obtenu le même résultat mais j'ai eu un message d'erreur plus long qui se lit comme suit :

mv : Access to the path 'D:\test\' is denied.
At line:1 char:1
+ mv D:\test\ D:\source\
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (D:\test\:DirectoryInfo) [Move-Item], IOException
    + FullyQualifiedErrorId : MoveDirectoryItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

Il est intéressant de noter que je viens de remarquer que le déplacement du dossier de test directement vers le dossier de destination à l'aide de la fonction move D:\test E:\destination déclenche également l'erreur "L'accès est refusé". Il se peut donc que mon problème ne soit pas spécifiquement lié au lien symbolique. Cependant, en déplaçant le dossier dans powershell avec move D:\test E:\destination fonctionne correctement (alors qu'il échouait lorsqu'il s'agissait d'un lien symbolique). C'est très étrange.

Pourquoi est-ce que je reçois cette erreur d'accès refusé et pourquoi est-ce qu'il ne renvoie une erreur que si j'essaie de déplacer un dossier et non un fichier ? De plus, pourquoi le déplacement direct du dossier échoue-t-il dans cmd mais réussit-il dans powershell ? Est-ce qu'il y a quelque chose que je peux faire pour contourner l'erreur ?

Remarque : j'ai essayé toutes les commandes en tant qu'administrateur.

Voici l'onglet sécurité des propriétés du dossier de destination :

security tab of destination folder's properties

Et voici l'onglet sécurité des propriétés du dossier de test :

security tab of test folder's properties

1voto

tukan Points 1679

Une question intéressante qui m'a fait réfléchir. @harrymc a raison. Cela n'a rien à voir avec les autorisations.

Il y a une différence lorsque vous utilisez move à cmd.exe o PowerShell

move à l'adresse cmd.exe es différents que le programme move de PowerShell . Move à PowerShell est n'est en fait qu'un alias de Move-Item considérant que move est un cmd.exe commande. Voir ci-dessous Notes pour la différence !

La question

Le problème est le même pour les liens symboliques ou les jonctions (pour plus d'informations sur les différences, voir annuaire-jonction-vs-directeur-lien-symbolique ).

Le problème est que la fonction interne de l move ( cmd.exe ) et Move-Item ( PowerShell ) ne peut pas gérer les changement de volume de l'entraînement . En substance, il s'agit de la même chose que Move-Item la régression pour PowerShell 7.2. Le cœur du problème est que la fonction MoveTo() ne peut pas gérer le changement de volume de l'entraînement (sur le lien symbolique) et il doit y avoir une solution de repli vers CopyAndDelete() fonction.

La solution

@cmd.exe

La solution pour cmd.exe est d'utiliser robocopy ( c:\Windows\System32\Robocopy.exe ). Les robocopy amortit xcopy à Windows 10. xcopy pourrait également être utilisé, mais il sera probablement supprimé à l'avenir. robocopy seulement.

Un exemple :

Pour déplacer un répertoire vers un lien symbolique dir :

a) robocopy d:\test d:\destination /E /MOVE

/E : Copy Subfolders, including Empty Subfolders.

/MOVE : Move files and dirs (delete from source after copying).

Veuillez noter une particularité : que si le répertoire d:\test est vide, il ne sera pas déplacé mais il sera supprimé.

b) robocopy d:\test d:\destination /S /MOV

/S : Copy Subfolders. /MOV : MOVe files (delete from source after copying).

Copie les sous-dossiers non vides et supprime les sous-dossiers non vides. fichiers uniquement après la copie.

@PowerShell

Vous pouvez utiliser le robocopy.exe ici aussi, mais si vous voulez le faire nativement pour toutes les versions de PowerShell, vous devez utiliser copy&delete (similaire à la "solution" ci-dessus lorsqu'il y a une solution de repli pour les changement de volume de l'entraînement sur le lien symbolique).

Le voici sur une seule ligne :

Copy-Item -Path d:\test -Destination d:\destination; Delete-Item -Path d:\test

Remarque : Si vous avez des problèmes avec Delete-Item vous pouvez essayer d'utiliser le -Force commutateur.

J'utilise PowerShell 5.1.18362.1801 la régression du déplacement des répertoires sera probablement corrigée dans les versions ultérieures.

Notes

PowerShell déplacer

NAME
    Move-Item

SYNTAX
    Move-Item [-Path] <string[]> [[-Destination] <string>] [-Force] [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>
    ] [-PassThru] [-Credential <pscredential>] [-WhatIf] [-Confirm] [-UseTransaction]  [<CommonParameters>]

    Move-Item [[-Destination] <string>] -LiteralPath <string[]> [-Force] [-Filter <string>] [-Include <string[]>] [-Exclude <stri
    ng[]>] [-PassThru] [-Credential <pscredential>] [-WhatIf] [-Confirm] [-UseTransaction]  [<CommonParameters>]

ALIASES
    mi
    mv
    move

REMARKS
    Get-Help cannot find the Help files for this cmdlet on this computer. It is displaying only partial help.
        -- To download and install Help files for the module that includes this cmdlet, use Update-Help.
        -- To view the Help topic for this cmdlet online, type: "Get-Help Move-Item -Online" or
           go to https://go.microsoft.com/fwlink/?LinkID=113350.

cmd.exe se déplacer :

move /?
Moves files and renames files and directories.

To move one or more files:
MOVE [/Y | /-Y] [drive:][path]filename1[,...] destination

To rename a directory:
MOVE [/Y | /-Y] [drive:][path]dirname1 dirname2

  [drive:][path]filename1 Specifies the location and name of the file
                          or files you want to move.
  destination             Specifies the new location of the file. Destination
                          can consist of a drive letter and colon, a
                          directory name, or a combination. If you are moving
                          only one file, you can also include a filename if
                          you want to rename the file when you move it.
  [drive:][path]dirname1  Specifies the directory you want to rename.
  dirname2                Specifies the new name of the directory.

  /Y                      Suppresses prompting to confirm you want to
                          overwrite an existing destination file.
  /-Y                     Causes prompting to confirm you want to overwrite
                          an existing destination file.

The switch /Y may be present in the COPYCMD environment variable.
This may be overridden with /-Y on the command line.  Default is
to prompt on overwrites unless MOVE command is being executed from
within a batch script.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X