Ricky
Ricky

Reputation: 377

Powershell -renaming a file after copying

I'm having ongoing trouble with a script I've written that is (supposed) to do the following. I have one folder with a number of csv files, and I want to copy the latest file with the company name into another folder, and rename it.

It is in the current format:

21Feb17070051_CompanyName_Sent21022017

I want it in the following format:

CompanyName21022017

So I have the following powershell script to do this:

## Declare variables ##

$DateStamp = get-date -uformat "%Y%m%d"
$csv_dest = "C:\Dest"
$csv_path = "C:\Location"

## Copy latest Company CSV file ##

get-childitem -path $csv_path -Filter "*Company*.csv" | 
    where-object { -not $_.PSIsContainer } | 
    sort-object -Property $_.CreationTime | 
    select-object -last 1 |
    copy-item -Destination $csv_dest

## Rename the file that has been moved ##

get-childitem -path $csv_dest -Filter "*Company*.csv" | 
    where-object { -not $_.PSIsContainer } | 
    sort-object -Property $_.CreationTime | 
    select-object -last 1 | rename-item $file -NewName {"Company" + $DateStamp + ".csv"} 

The file seems to copy ok, but the rename fails -

Rename-Item : Cannot bind argument to parameter 'Path' because it is null.
At C:\Powershell Scripts\MoveCompanyFiles.ps1:20 char:41
+     select-object -last 1 | rename-item $file -NewName {"CompanyName" + $DateSt ...

I think it is something to do with the order in which powershell works, or the fact it can't see the .csv in the $file variable. There are other files (text files, batch files) in the destination, in case that affects things. Any help in where I'm going wrong would be appreciated.

Upvotes: 4

Views: 17543

Answers (2)

karfkars
karfkars

Reputation: 4063

You can rename and copy in a single command. Just use Copy-Item Command and give new path and name as -Destination parameter value. It will copy and rename the file. You can find an example below.

$source_path = "c:\devops\test"
$destination_path = "c:\devops\test\"
$file_name_pattern = "*.nupkg"

get-childitem -path $source_path -Filter $file_name_pattern | 
Copy-Item -Destination { $destination_path + $_.Name.Split("-")[0] + ".nupkg"}

Upvotes: 3

Frode F.
Frode F.

Reputation: 54891

As wOxxOm answered, you need to remove $file from Rename-Item as it is not defined and the cmdlet already receives the inputobject through the pipeline.

I would also suggest that you combine the two operations by passing through the fileinfo-object for the copied file to Rename-Item. Ex:

## Declare variables ##

$DateStamp = get-date -uformat "%Y%m%d"
$csv_dest = "C:\Dest"
$csv_path = "C:\Location"

## Copy and rename latest Company CSV file ##

Get-ChildItem -Path $csv_path -Filter "*Company*.csv" | 
Where-Object { -not $_.PSIsContainer } | 
Sort-Object -Property CreationTime | 
Select-Object -Last 1 |
Copy-Item -Destination $csv_dest -PassThru |
Rename-Item -NewName {"Company" + $DateStamp + ".csv"}

Upvotes: 5

Related Questions