Home > Software design >  storing filename and path in variable to use with Copy-Item
storing filename and path in variable to use with Copy-Item

Time:01-24

I'm trying to write a script to find the most recent .bak in a certain directory and copy the file to another location. When I use Get-ChildItem the file name isn't enlcosed in single quotes so when i try to copy it Copy-Item cant find it. ( I think)

$dir = 'E:\Backups\'

$dest = 'F:\'

$filename = Get-ChildItem -path $dir -filter *.bak |  Sort-Object CreationTime -Descending | Select-Object -First 1 | select FullName | Format-Table -HideTableHeaders

echo @filename

copy-Item -path @filename -destination @dest


echo @filename returns E:\Backups\company.bak but i think need 'E:\Backups\company.bak' for it to work?

PS C:\Users\prodadmin> copy-Item -path @filename -destination @dest
Copy-Item : A positional parameter cannot be found that accepts argument 'Microsoft.PowerShell.Commands.Internal.Format.GroupStartData'.
At line:1 char:1
  copy-Item -path @filename -destination @dest
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      CategoryInfo          : InvalidArgument: (:) [Copy-Item], ParameterBindingException
      FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.CopyItemCommand

As above, typed it all in one go.

CodePudding user response:

  • Get-ChildItem returns FileInfo (and also DirectoryInfo) objects.

  • By using select FullName you tell PowerShell to return an new object with one property called FullName and you lose the Name property.

  • Format-Table is a cmdlet used for display purposes only, so never use that on data you want to process further.

  • Lastly, you prefix the variables you have with @ instead of $

Try

$dir  = 'E:\Backups\'
$dest = 'F:\'

$file = Get-ChildItem -Path $dir -Filter '*.bak' -File |   # do not return directories
        Sort-Object CreationTime -Descending |             # or did you mean LastWriteTime (=> last modified date) ?
        Select-Object -First 1                             # return just 1 FileInfo object


Write-Host "Found $($file.Name)"  # write to console

Copy-Item -Path $file.FullName -Destination $dest
  • Related