我重新安装了 Windows 10,但我备份的许多文件都没有变成文件夹。
例如:文件以前是“index.hmtml”。现在这个文件变成了一个名为“index html”的文件夹,里面有两个文件。我要找的“index.hml”文件和一个名为“$Zone.Identifier$$DATA”的文件
为什么会发生这种情况?我该怎么做才能解决这个问题?
我可以手动修复它,但有数千个文件。有没有办法制作批处理脚本来处理这个问题?
非常感谢。我正在使用 Windows 10 Enterprise LTSC 2018,我刚刚从同一版本重新安装。
编辑1:我没有修改任何组策略。
编辑 2:提供更多信息:下面是这些文件存储方式的一个示例:
DSCN5330.JPG (this is a folder)
--> $Zone.Identifier$$DATA
--> DSCN5330.JPG (this is the original file)
lynn2010.pdf
--> $Zone.Identifier$$DATA
--> lynn2010.pdf
Mass_Media_final.doc
--> $Zone.Identifier$$DATA
--> Mass_Media_final.doc
这些文件都存储在我的桌面上,像这样,我在其他几个位置也有许多文件,但是这些目录不太深,所以我可以轻松地将脚本放在父目录中并对所有子文件夹执行它。
我承认,也许我执行文件备份的方式存在问题:多年来,我使用 Windows 轻松传输来快速备份文件并将其移动到新安装。由于 WET 不再受支持,因此只需从 win7 复制 migwiz 文件夹并将其用于 win 10。我实际上是从 Spiceworks 获得这个想法的,但我只尝试过 win7->win10,从未 win10->win10。我猜 Windows 10 添加了新数据或其他东西,这就是为什么 wet 无法正确创建这些文件的原因。我通过从 mig 文件中提取文件来恢复文件,并且它们在该文件中也以相同的方式存在。所以我想损害已经造成了。现在没有回头路了。
答案1
这是一个有趣的小挑战。获取具有匹配文件夹名称的文件很容易:
gci -File -Recurse | ? { $_.Name -Like $_.Directory.Name}
但是将文件移动到其祖父母目录会因为带有文件名的文件夹而变得复杂。因此解决方案是在移动时重命名文件。我在前面添加了一个任意字符串'qqq'
:
gci -File -Recurse | ? { $_.Name -Like $_.Directory.Name} |
% {Move-Item -Path $_.FullName -Destination ($_.Directory.Parent.FullName + '\' +'qqq' + $_.Name ) -PassThru }
我总是试图保持管道畅通,但是当我添加:
递归 + 修改 + 管道 = 怪异
**编辑:当然,发布后不久我就发现了此代码问题的解决方案......括号!!!
编辑 2:工作、格式化。本文末尾的流水线代码。**
( gci -File -Recurse | ? { $_.Name -Like $_.Directory.Name } ) |
...
gci -File -Recurse | ? { $_.Name -Like $_.Directory.Name } |
% { Move-Item -Path $_.FullName -Destination ( $_.Directory.Parent.FullName + '\' +'qqq' + $_.Name ) -PassThru } |
% {
REmove-Item ( $_.FullName -replace 'qqq' )
Rename-Item -Path $_.FullName -NewName ( $_.Name -replace 'qqq' )
}
各种错误都出现了!即使在修复了语法和一些Name
混淆之后FullName
,我仍然会遇到Get-ChildItem
错误。我记得我以前见过它有问题,当你将递归与修改结合起来时,事情会变得很奇怪。所以我把它分解了,这不仅消除了错误,而且更容易获得必要的路径。所以这很有效。唯一与位置相关的行是前两行,没有指定路径Get-ChildItem
。你应该$Source = ...
单独执行并验证它的内容。但希望你不要养成用扩展名命名文件夹的习惯。:D
工作守则
Get-ChildItem '$Zone.Identifier$$DATA' -recurse -force | Remove-Item -Force
$Source = Get-ChildItem -File -Recurse | ? { $_.Name -Like $_.Directory.Name}
$Moved = $Source | % {
$Splat = @{
'Path' = $_.FullName;
'Destination' = ('{0}\qqq{1}' -f $_.Directory.Parent.FullName, $_.Name);
'PassThru' = $True
}
Move-Item @Splat
}
Remove-Item $Source.DirectoryName
$Moved | Rename-Item -NewName { $_.FullName -replace 'qqq' }
工作代码,纯管道:
( Get-ChildItem -File -Recurse | ? { $_.Name -Like $_.Directory.Name } ) | % {
$Splat = @{
'Path' = $_.FullName;
'Destination' = ('{0}\qqq{1}' -f $_.Directory.Parent.FullName, $_.Name);
'PassThru' = $True
}
Move-Item @Splat
} | %{
Remove-Item ($_.FullName -replace 'qqq')
Rename-Item -Path $_.FullName -NewName ( $_.Name -replace 'qqq' )
}