Supprimer le répertoire indépendamment de 260 char limite
Je suis en train d'écrire un script simple pour supprimer l'outil USMT la migration des dossiers après un certain nombre de jours:
## Server List ##
$servers = "Delorean","Adelaide","Brisbane","Melbourne","Newcastle","Perth"
## Number of days (-3 is over three days ago) ##
$days = -3
$timelimit = (Get-Date).AddDays($days)
foreach ($server in $servers)
{
$deletedusers = @()
$folders = Get-ChildItem \$server\USMT$ | where {$_.psiscontainer}
write-host "Checking server : " $server
foreach ($folder in $folders)
{
If ($folder.LastWriteTime -lt $timelimit -And $folder -ne $null)
{
$deletedusers += $folder
Remove-Item -recurse -force $folder.fullname
}
}
write-host "Users deleted : " $deletedusers
write-host
}
Cependant, je continuez à frapper le redoutable Remove-Item : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
J'ai été à la recherche à des solutions de rechange et des solutions de rechange, mais ils ont tous tournent autour de moi, prendre soin de ce qui est dans le dossier.
J'espérais une solution plus simple que je ne suis pas vraiment à le contenu du dossier si il est marqué pour suppression.
Est-il un natif de l'applet de commande Powershell autres que Remove-Item -recurse qui peut accomplir ce que je suis après?
Vous devez vous connecter pour publier un commentaire.
C'est une limitation connue de
PowerShell
. Le travail est d'utiliserdir
cmd (désolé, mais c'est vrai).http://asysadmin.tumblr.com/post/17654309496/powershell-path-length-limitation
ou, comme mentionné par AaronH répondre utilisation \?\ la syntaxe est dans cet exemple de supprimer construire
dir
semble pas trop.J'ai souvent ce problème avec le noeud projets. Ils nichent leurs dépendances et une fois que git cloné, il est difficile de les supprimer. Un joli nœud d'utilité, je suis tombé sur rimraf.
Comme CADII dit dans une autre réponse: Robocopy est capable de créer des chemins d'accès plus long que la limite de 260 caractères. Robocopy est également capable de supprimer de tels chemins. Vous pouvez simplement refléter certains dossier vide sur votre chemin contenant trop de noms longs dans le cas où vous souhaitez supprimer.
Par exemple:
Voici la Robocopy référence connaître les paramètres et les différentes options.
Cette réponse sur le SuperUser résolu pour moi: https://superuser.com/a/274224/85532
node_modules
dossier. Pour ce cas, j'ai eu recours à cette autre réponse comme je l'ai nœud installés dans ce cas de toute façon.J'ai créé une PowerShell fonction qui est capable de supprimer un long chemin (>260) à l'aide de l'mentionnées robocopy technique:
Exemple d'utilisation:
J'ai appris un truc il y a un moment qui travaille souvent pour obtenir autour de fichier long chemin. Apparemment, en cas d'utilisation de l'API de Windows, certaines fonctions seront versés par le code de legs qui ne peut pas gérer les noms de fichiers longs. Toutefois, si vous formatez vos chemins d'accès, en particulier, le code héritage est à éviter. Le truc qui permet de résoudre ce problème consiste à faire référence à des chemins à l'aide de la "\\?\" préfixe. Il convient de noter que pas toutes les API de soutenir cela, mais dans ce cas particulier, il a travaillé pour moi, voir mon exemple ci-dessous:
L'exemple suivant échoue:
Cependant, en préfixant le chemin avec "\\?\" rend la commande de travailler avec succès:
Si vous avez ruby installé, vous pouvez utiliser Fileman:
Une fois installé, vous pouvez simplement exécuter la ligne suivante dans votre invite de commande:
Ce problème est une vraie douleur dans le cou lorsque vous êtes en développement dans node.js sur Windows, donc fileman devient vraiment pratique pour supprimer tous les déchets une fois dans un tandis que
Si tout ce que vous avez à faire est de supprimer les fichiers, j'utilise une fonction de raccourcir les noms, puis-je supprimer.
Je sais que c'est une vieille question, mais j'ai pensé que je voudrais mettre ça ici au cas où quelqu'un en avait besoin.
Il existe une solution de contournement qui utilise Expérimentale.IO de Classe De Base Des Bibliothèques projet. Vous pouvez le trouver sur poshcode, ou le télécharger à partir blog de l'auteur. 260 limitation est dérivé de .NET, donc c'est soit cela, soit en utilisant des outils qui ne dépendent pas de .NET (comme
cmd /c dir
, comme @Bill a suggéré).Cela se fait vieux, mais j'ai récemment eu à travailler autour d'elle de nouveau. J'ai fini par en utilisant "subst" comme il n'a pas besoin d'autres modules ou fonctions disponibles sur le PC c'était d'exécution. Un peu plus portable.
Essentiellement de trouver un disque de rechange lettre, "subst" le long chemin qui mène à cette lettre, puis de l'utiliser comme base pour le GCI.
Seule limitation est que le $_.prénom, nom et d'autres propriétés de rapport la lettre de lecteur que le chemin d'accès racine.
Semble fonctionner ok:
Que la commande est bien évidemment pas de supprimer les fichiers, mais peut être substitué.
PowerShell peut être utilisé facilement avec AlphaFS.dll faire fichier I/O trucs
sans le CHEMIN d'accès TROP LONG tracas.
Par exemple:
Veuillez voir sur Codeplex: https://alphafs.codeplex.com/ pour cela .Un projet de réseau.
Combinaison d'outils peuvent travailler mieux, essayez de faire un dir /x pour obtenir le nom de fichier 8.3 à la place. Vous pouvez ensuite analyser cette sortie vers un fichier texte, puis de construire un script powershell pour supprimer les chemins que vous out-file avais. Vous prendre tout de une minute. Alternativement, vous pouvez simplement renommer le nom de fichier 8.3 à quelque chose de plus court, puis les supprimer.
Pour mon Robocopy travaillé en 1, 2 et 3
L'ajout de Daniel Lee solution,
Lorsque l' $myDir a des espaces dans le milieu, il donne FICHIER NON TROUVÉ des erreurs en considérant un ensemble de fichiers splittés de l'espace. Pour surmonter cette utilisation des citations autour de la variable et de mettre powershell caractère d'échappement pour sauter le quatations.
PS>cmd.exe /C "rmdir /s /q <grave-accent>"$myDir<grave-accent>""
Veuillez remplacer le bon grave-caractère accentué au lieu de
<grave-accent>
ALORS joue avec moi et je ne peux pas l'ajouter :). L'espoir sera mis à jour pour les autres de comprendre facilement
Juste pour être complet, j'ai trouver cela un peu plus de temps et ont utilisé une combinaison du "subst" et "New-PSDrive" pour contourner dans diverses situations.
Pas exactement une solution, mais si quelqu'un est à la recherche de solutions alternatives, ce qui pourrait aider.
Subst semble très sensible au type de programme que vous utilisez pour accéder aux fichiers, parfois ça marche et parfois ça ne marche pas, semble être le même que le New-PSDrive.
Quelque chose développée en utilisant .NET de la boîte échouera avec les chemins trop longtemps. Vous devrez les déplacer à 8.3 les noms, PInVoke (Win32) appels, ou utiliser robocopy
J'ai eu le même problème lors de la tentative de supprimer des dossiers sur un ordinateur distant.
Rien mais... j'ai trouvé un truc :
Fonctionne comme un charme sur le local ou à distance des dossiers (à l'aide du chemin d'accès UNC)