2011-12-30 18 views
9

Próbuję rekurencyjnie skopiować pliki i zmienić ich nazwy.Zmień nazwę po skopiowaniu przy użyciu programu Power Shell

Moje foldery mają plik o tej samej nazwie, więc muszę zmienić jego nazwę w momencie, gdy jest on kopiowany.

Ale wciąż stoję w obliczu problemu. Oto mój kod. Powinien znaleźć plik CopyForBuild.bat i skopiować go do folderu E: \ CopyForBuild. Po skopiowaniu, pierwszym plikiem powinien być Copyforbuild1.txt, drugim będzie CopyforBuild2.txt i tak dalej.

Oto mój kod. Gdzie ja zawodzę?

$File = Get-ChildItem -Path V:\MyFolder -Filter CopyForbuild.bat -Recurse 

$i=1 
Foreach ($f in $File) 
{ 

    Copy-Item $f "E:\copyforbuild\" 
    Rename-Item -path "E:\Copyforbuild\"+"$f" -newname "CopyForbuild"+"$i"+".txt" 
    $i = $i+1 
} 

Odpowiedz

14

Można zmienić nazwę pliku podczas kopiowania w Copy-item, po prostu zapewnić pełną ścieżkę w obu miejscach:

copy-item c:\PST\1.config c:\PST\2.config 

Spowoduje to zmianę nazwy 1.config do 2.config. Nie trzeba wywoływać oddzielnej funkcji zmiany nazwy. Twój kod powinien wyglądać mniej więcej tak:

$File = Get-ChildItem -Path "V:\MyFolder\" -Filter CopyForbuild.bat -Recurse 

$i=1 
Foreach ($f in $File) 
{ 
    Copy-Item $f.FullName ("E:\copyforbuild\" + $f.BaseName + $i +".txt") 
    $i++ 
} 

Można uczynić go jeszcze krótszy, jeśli zastosowanie pętli For:

$File = Get-ChildItem -Path "V:\MyFolder\" -Filter CopyForbuild.bat -Recurse 

for($i = 0; $i -lt $File.Count; $i++) 
{ 
    Copy-Item $File[$i].FullName ("E:\copyforbuild\" + $File[$i].BaseName + $i +".txt") 
} 

Lub droga krótsza i szersza jeśli śledzić komentarz Richarda

+4

Dlaczego nie proces wszystko po jednym na raz (i pamiętaj, że zmienne otrzymują wartości domyślne): 'Get-ChildItem -Path V: \ MyFolder -filt CoptForBuild.bat -rec | Copy-Item -dest {"E: \ copyforbuild \" + $ _. BaseName + ($ i ++) + ". Txt"} '. (Pliki cmdlet z parametrami, które nie pobierają obiektu typu, np. Miejsce docelowe Copy-Item, mają wbudowane dla siebie za pomocą nawiasów klamrowych, więc nie ma potrzeby, aby pętla określała miejsce docelowe.) – Richard

+0

Kolego, To rzuca wyjątek . "Copy-Item: nie można powiązać argumentu z parametrem" Path ", ponieważ ma on wartość NULL." $ Plik nie zawiera żadnych pozycji, gdy określono "*. *" – Samselvaprabu

+0

$ Plik = Get-ChildItem -Path "V: \ MójFolder \\ *. *" -Filtr KopiujForbuild.bat -Recurse $ i = 1 Foreach ($ f w $ file) { Kopiowaniem pozycja $ f.FullName ("E: \ copyforbuild \" + $ f.BaseName + $ i +) $ i ++ "txt".} – Samselvaprabu

Powiązane problemy