2009-11-06 4 views
4

Je suis un novice de Powershell, essayant d'exécuter un script simple.PowerShell: comment copier uniquement les fichiers sélectionnés à partir du répertoire source?

J'ai une liste de fichiers que je veux copier de certains src_dir vers un dst_dir. J'ai écrit un script simple (ce qui est évidemment faux car il n'a rien fait quand je l'ai exécuté).

Quelqu'un pourrait-il aider à vérifier pour voir ce que je fais mal?

# source and destionation directory 
$src_dir = "C:\Users\Pac\Desktop\C4new" 
$dst_dir = "C:\Users\Pac\Desktop\csci578-hw3\Prism\C4new" 

# list of files from source directory that I want to copy to destination folder 
# unconditionally 
$file_list = "C4newArchitecture.java", "CustomerData.java" 

# Copy each file unconditionally (regardless of whether or not the file is there 
for($i=0; $i -le $file_list.Length - 1; $i++) 
{ 
    Copy-Item -path $src_dir+$file_list[$i] -dest $dst_dir -force 
} 

Répondre

9

Oh..that était en fait assez facile:

# source and destionation directory 
$src_dir = "C:\Users\Pac\Desktop\C4new\" 
$dst_dir = "C:\Users\Pac\Desktop\csci578-hw3\Prism\C4new" 

# list of files from source directory that I want to copy to destination folder 
# unconditionally 
$file_list = "C4newArchitecture.java", 
      "CustomerData.java", 
      "QuickLocalTransState.java", 
      "QuickLocalTransState_AbstractImplementation.java", 
      "SaveSessionOK.java", 
      "SessionID.java", 
      "UserInterface.java", 
      "UserInterface_AbstractImplementation.java" 

# Copy each file unconditionally (regardless of whether or not the file is there 
foreach ($file in $file_list) 
{ 
    Copy-Item $src_dir$file $dst_dir 
} 

En tant que programmeur, j'aime le foreach!

11

Si l'on suppose que les fichiers sont directement unde src_dir de $, vous pouvez le faire un peu plus simplement à savoir la copie peut être une seule ligne:

$file_list | Copy-Item -Path {Join-Path $src_dir $_} -Dest $dst_dir -ea 0 -Whatif 

-ea est l'alias pour le paramètre -ErrorAction et 0 La valeur correspond à SilentlyContinue. Cela provoque l'élément de copie pour ignorer les erreurs comme vous obtiendriez si l'un des fichiers source n'existait pas. Cependant, si vous rencontrez des problèmes, supprimez temporairement ce paramètre pour pouvoir voir les messages d'erreur. Lorsque j'écris ce type de façon interactive, j'ai tendance à utiliser des raccourcis comme celui-ci, mais dans les scripts, il est préférable de l'épeler pour plus de lisibilité. Notez également que le paramètre -Path peut prendre un script script, c'est-à-dire un script entre accolades. Techniquement, la cmdlet Copy-Item ne voit jamais le scriptblock, seulement les résultats de son exécution. Cela fonctionne en général pour tout paramètre qui prend l'entrée de pipeline. Supprimez le -WhatIf pour que la commande s'exécute réellement.

+0

wow..that l'air cool. merci de partager l'info! – sivabudh

0
Get-ChildItem -Path $srcDir | Where-Object { $fileNames -contains $_.Name } | Copy-Item -Destination $dstDir 

Ceci est très pratique dans certains scénarios, par exemple:

Get-ChildItem -Filter *.ocr.txt | Copy-Item -Destination $dstDir 
Questions connexes