在变量中存储文件名和路径以用于Copy-Item



我想写一个脚本来找到最近的。bak在某个目录,并将文件复制到另一个位置。当我使用Get-ChildItem时,文件名不包含在单引号中,所以当我试图复制它时,copy - item找不到它。(我认为)

$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返回E:Backupscompany.bak,但我认为需要'E:Backupscompany.bak'才能正常工作?

PS C:Usersprodadmin> 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

和上面一样,一次全部输入。

  • Get-ChildItem返回FileInfo(以及DirectoryInfo)对象.

  • 通过使用select FullName,你告诉PowerShell返回一个新的对象,一个属性叫做FullName,你失去了Name属性。

  • Format-Table是仅用于显示目的的cmdlet,所以不要在你想要进一步处理的数据上使用。

  • 最后,用@代替$作为变量的前缀

尝试
$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

最新更新