Reputation: 2029
I am using the following command to copy files from a network share to my local hard drive based on a CSV file.
import-csv C:\TEST\test.csv | foreach {copy-item -path $_.npath -destination 'C:\TEST\'}
The next step would be to then use a different CSV file to rename these files based on their current file name.
Is there a command that will allow me to copy and item and rename it as well?
Upvotes: 42
Views: 143507
Reputation: 11
The good option would be to copy the source using $file.FullName and remember about the $file.Extention included in the -Destination parameter if not a folder.
$file = Get-ChildItem -Path . -Name "name"
Copy-Item -Path $file.FullName -Destination "$($new_name)$($file.Extention)"
Upvotes: 0
Reputation: 54981
If you have a CSV containing two columns, oldfilepath and newfilename, then you can use the following.
Import-Csv C:\test.csv | % { Copy-Item -Path $_.oldfilepath -Destination "C:\TEST\$($_.newfilename)" }
Notice how the $_.newfilename
is encapsulated inside a $()
. That's because $_.newfilename
is an expression (since we are getting a property out of the variable), and not a variable. $()
tells PowerShell to solve the expression before using it in the string. If we don't use it, it would have used the whole csv-object for that row($_
) as a string and returned an error.
Upvotes: 46
Reputation: 1315
If your original CSV also had the new name in it, you would be able to use it to specify a filename onto the end of your copy path. The copy-item CMDlet allows you to specify the destination filename
Copy-Item C:\TEST\file1.jpg C:\TEST\file2.jpg
Will copy file1.jpg and rename it to file2.jpg
To concatenate the variable onto the end of the path string, you'd use double quotes like this:
Copy-Item C:\Path\To\File\file.ext "C:\Path\To\New\File\$newfilename"
Note that the -path and -destination aren't really necessary as they're implied by the position.
Upvotes: 31