Eu tenho uma unidade chamada D e uma unidade chamada E. Criei uma pasta chamada "teste" na unidade D e uma pasta chamada "destino" na unidade E usando o comando mkdir. Em seguida, no DI, criei um link simbólico usando o seguinte comando:
mklink /D D:\source E:\destination
Agora, quando tento mover a pasta chamada "test" de D para D:\source usando o comando move D:\test D:\source
, recebo uma mensagem de erro simplesmente dizendo "Acesso negado". Se eu tentar mover um arquivo chamado "test.txt" com o comando move D:\test.txt D:\source
, não recebo nenhum erro e o arquivo é movido para E:\destination com sucesso.
Eu também tentei fazer isso no powershell com o comando mv D:\test\ D:\source\
e obtive o mesmo resultado, mas recebi uma mensagem de erro mais longa que diz:
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
Curiosamente, acabei de notar que mover a pasta de teste diretamente para a pasta de destino usando move D:\test E:\destination
também aciona o erro "Acesso negado". Portanto, meu problema pode não estar relacionado especificamente ao link simbólico. No entanto, mover a pasta no powershell move D:\test E:\destination
funciona bem (enquanto estava falhando quando era um link simbólico). É muito estranho.
Por que estou recebendo este erro de acesso negado e por que ele só retorna um erro se eu tentar mover uma pasta e não um arquivo? Além disso, por que mover diretamente a pasta falha no cmd, mas é bem-sucedido no powershell? Existe algo que eu possa fazer para contornar o erro?
Nota: tentei todos os comandos como administrador.
Aqui está a guia de segurança das propriedades da pasta de destino:
E aqui está a guia de segurança das propriedades da pasta de teste:
Uma questão interessante que me fez pensar. @harrymc está certo. Isso não tem a ver com permissões.
Há uma diferença onde você usa
move
emcmd.exe
ouPowerShell
move
command atcmd.exe
é um programa diferentemove
dePowerShell
.Move
atPowerShell
é na verdade apenas um alias paraMove-Item
while é um comandomove
interno .cmd.exe
Veja abaixo Notas para a diferença!O problema
Esse problema será o mesmo para links simbólicos ou junções (para saber mais sobre as diferenças, consulte directory-junction-vs-directory-symbolic-link ).
O problema é que a função interna de
move
(cmd.exe
) eMove-Item
(PowerShell
) não pode lidar com a alteração do volume da unidade . Em essência, é o mesmo que Move-Item a regressão para o PowerShell 7.2. O cerne do problema é que a funçãoMoveTo()
não pode lidar com a alteração do volume da unidade (no link simbólico) e deve haver um fallback para aCopyAndDelete()
função.A solução
@cmd.exe
A solução para
cmd.exe
é usarrobocopy
(c:\Windows\System32\Robocopy.exe
). Asrobocopy
depreciaçõesxcopy
no Windows 10.xcopy
também podem ser usadas, mas provavelmente serão removidas no futuro, então os exemplos sãorobocopy
apenas para uso.Um exemplo:
Para mover um diretório para um diretório de link simbólico:
a)
robocopy d:\test d:\destination /E /MOVE
/E : Copy Subfolders, including Empty Subfolders.
/MOVE : Move files and dirs (delete from source after copying).
Observe um recurso: se o diretório
d:\test
estiver vazio, ele não será movido, mas será excluído.b)
robocopy d:\test d:\destination /S /MOV
/S : Copy Subfolders.
/MOV : MOVe files (delete from source after copying).
Copia subpastas não vazias e remove arquivos somente após a cópia.
@PowerShell
Você também pode usar o
robocopy.exe
aqui, mas se quiser fazê-lo nativamente para todas as versões do PowerShell, precisará usarcopy&delete
(semelhante à "correção" acima quando houver um fallback para a alteração do volume da unidade no link simbólico).Aqui está em uma linha:
Copy-Item -Path d:\test -Destination d:\destination; Delete-Item -Path d:\test
Nota: Se você tiver problemas
Delete-Item
, tente usar o-Force
switch.Estou usando
PowerShell 5.1.18362.1801
a movimentação da regressão de diretório provavelmente será corrigida em versões posteriores.Notas
PowerShell
jogadacmd.exe
jogada: