Powershell Remove-Item SI le fichier existe déjà, après la Copie de l'élément de
J'ai besoin d'ajouter un filet de sécurité dans mon script. Je suis en train de faire un travail de copie en fonction d'une liste d'utilisateurs fournis par le biais d'un fichier txt. Copier les fichiers de ce répertoire de base d'utilisateurs vers un nouvel emplacement. Une fois les fichiers copiés, vérifier si le fichier existe dans le nouvel emplacement. Si oui, puis Retirez-Élément.
Quelqu'un peut m'aider? Je ne sais pas comment la mettre la "si le fichier existe déjà" la logique.
$username = Get-Content '.\users.txt'
foreach ($un in $username)
{
$dest = "\\server\homedirs$un\redirectedfolders"
$source = "\\server\homedirs$un"
New-Item -ItemType Directory -Path $dest\documents, $dest\desktop
Get-ChildItem $source\documents -Recurse -Exclude '*.msg' | Copy-Item -Destination $dest\documents
Get-ChildItem $source\desktop -Recurse -Exclude '*.msg' | Copy-Item -Destination $dest\desktop
Get-ChildItem $source\mydocuments, $source\desktop -Recurse -Exclude '*.msg' | Remove-Item -Recurse
}
OriginalL'auteur Refried04 | 2014-04-21
Vous devez vous connecter pour publier un commentaire.
Pour répondre à votre question soi, vous pouvez le faire comme ceci:
$_ -replace "^$([regex]::escape($source))","$dest"
convertit le chemin d'accès de chaque source de l'article que vous êtes de l'énumération avec le chemin d'accès de destination, par le remplacement de $source au début de la trajectoire avec $dest.^$source
(qui signifie "correspond à la valeur de $source au début de la chaîne"). Cependant, vous devez utiliser [regex]::escape en cas $source contient des regex caractères spéciaux, qui est en fait extrêmement probablement avec Windows chemins d'accès, car ils contiennent des barres obliques inverses. Par exemple, la valeur que vous avez donné ici pour $source contient\s
, qui, dans une regex signifie "tout blanc".$([regex]::escape($source))
interpole la valeur de $source avec tout regex spécial correctement les caractères d'échappement, de sorte que vous êtes correspondant à la valeur explicite.Cela dit, si votre but est de copier chaque élément vers un nouvel emplacement, et de supprimer l'original uniquement si la copie vers le nouvel emplacement est réussie, il semble que vous êtes en train de réinventer la roue. Pourquoi ne pas simplement utiliser Move-Item au lieu de la Copie de l'Élément de?
Ne sont pas directement liés à la question, mais plutôt que de répéter la même commande pour chaque sous-répertoire, vous pouvez utiliser un foreach boucle:
OriginalL'auteur Adi Inbar
Le chemin le plus court pour supprimer le fichier si il n'existe pas est de ne PAS utiliser
Test-Path
mais:rm my_file.zip -ea ig
C'est la version courte de
rm my_file.zip -ErrorAction Ignore
qui est beaucoup plus lisible et plus SEC puis
if (Test-Path my_file.zip) { rm my_file.zip }
Test-Path
revient avec une réponse positive, le dossier peut-être déjà été supprimés, à quel point l'appel à la vanille,Remove-Item
lèvera une erreur.Je n'étais même pas au courant de qui et et vous avez entièrement raison. Un avantage supplémentaire est qu'il indique clairement l'intention du programmeur - si je veux supprimer le test de dépistage quelque chose avant est un bruit.
Sur la deuxième pensée, le problème ici est qu'il pourrait cacher une autre erreur. Par exemple, le fichier est peut-être là, mais d'un problème d'autorisations ne vous empêche de le supprimer. Je ne suis pas un PS expert, mais une recherche rapide tourne
ErrorVariable
ce qui peut être utile dans disambiguating de tels cas.ErrorVariable ou de l'utilisation
-ea 0
(silencieusement se poursuit, mais les dossiers d'erreur) et vérifier l'Erreur par la suite.Avoir à vérifier ErrorVariable défaites le but de les rendre plus courte que avec Test-Chemin. Je tiens à le faire de cette façon:
Get-ChildItem * -Include my_file.zip | Remove-Item
. Il m'évite d'avoir à spécifier le nom de fichier deux foisOriginalL'auteur majkinetor
Test-Chemin commandlet va vous aider à vérifier si le fichier existe
http://technet.microsoft.com/en-us/library/ee177015.aspx
OriginalL'auteur Knows Not Much