我正在编写一个脚本,用于从A到B复制其元数据与list.txt文件匹配的文件。
list.txt文件包含要复制的每个文件的长度(大小),LastWriteTime和filename.ext。例如:
"5475891","2017-02-18 20:28:22","aaa.JPG"
"555109","2017-06-22 06:59:34","bbb.pdf"
"56363","2017-06-30 22:44:48","uuu.docx"
"638700","2017-07-31 18:41:43","uuu.docx"
"647053","2014-08-15 20:56:28","ppp.jpg"
"78725","2017-08-02 05:55:57","fff.php"
"79946","2017-08-02 06:42:03","kkk.pdf"
"8404037","2016-05-19 05:58:20","iii.pdf"
"85957","2017-07-31 22:44:23","777.pdf"
A上的每个文件,递归地,在长度, LastWriteTime 和 .ext(扩展名)中100%匹配(忽略.ext!之前的文件名字符)将被复制到B,保留A中存在的目录树结构。(A或B中没有覆盖或删除)。 / p>
我坚持使用脚本:
$Source=Get-Content list.txt
Get-childitem -recurse -file | select-object length, lastwritetime, GetExtension
foreach($item in $Source){
$file = gci -filter $("*{0}*" -f $item)
if ($file -ne $null)
{
Copy-Item $file A: B:
}
}
关于我做错了什么的建议? PowerShell或PHP。
答案 0 :(得分:1)
Get-Help command
将提供每个命令的正确语法。
编辑已更改为使用完整日期时间作为密钥的一部分并使用小写扩展名
EDIT2 插入if
以检查$ Destination文件夹是否存在,如果没有创建它。这确实在本地测试中有效。
## Q:\Test\2017\08\25\SO_45872202.ps1
$Source = "Q:\Test\2017\"
$Target = "C:\Test\2017\"
$List = Import-Csv list.txt -Header Size,LastWriteTime,Name
$Hash = @{}
ForEach ($Row in $List){
$Key = ("{0},{1},.{2}" -F $Row.Size,$Row.LastWriteTime,$Row.Name.Split('.')[-1].ToLower())
IF (!($Hash[$Key])) {$Hash.Add($Key,$Row.Name)}
}
$Hash | Format-Table -Auto
Get-Childitem -Path $Source -Recurse -File | ForEach-Object {
$Key = ("{0},{1},{2}" -F $_.Length,($_.LastWriteTime).ToString('yyy-MM-dd HH:mm:ss'),$_.Extension.ToLower())
#$Key
If ($Hash[$Key]){
$Destination = $_.FullName -Replace "^$([RegEx]::Escape($Source))","$Target"
If (!(Test-Path (Split-Path $Destination))){MD (Split-Path $Destination)|Out-Null}
$_ | Copy-Item -Destination $Destination #-WhatIf
}
}
如果输出看起来正常,请从Copy-Item
中删除尾随的-WhatIF