我想写一个脚本来找到最近的。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