最近为客户安装了一台新的 Windows 2012 Essentials 服务器。他们有一个非常旧的 XP 系统,一直用作文件服务器。在看似成功将客户文件从旧 XP 系统迁移数周后,客户发现了几个 0KB 文件。
我搜索了它们的文件结构,有数千个这样的文件。
好消息是,我仍然有原始磁盘,并且文件仍然存在并且可以在此磁盘上使用。我将其作为 image.vhd 并作为驱动器附加到服务器。
坏消息是客户已经使用并更新了数据迁移中的多个文件,因此无法对数据进行整体重新导出。或者即使我做了一次并手动观察如何替换 0KB 文件,由于涉及的文件数量太多,所花费的时间也不切实际。
这是我第一次处理这种问题,我不知道该如何最好地解决这个问题。
我知道我需要以某种方式搜索大小为 0KB 的客户端数据文件,然后当找到一个文件时,在原始磁盘上查找该文件,然后复制并将服务器上的 0KB 文件替换为在原始磁盘上找到的文件。
我会写代码,但不是在 Windows 上。我的编码经验是 PHP、HTML、CSS、Javascript 以及其他围绕网站和数据库的语言。
我确实需要一些帮助来了解如何解决这个问题。
提前致谢!
答案1
下一个脚本可以作为起点。
@ECHO OFF >NUL
@SETLOCAL enableextensions disabledelayedexpansion
set "serverPath=D:\Path\files"
set "backupPath=D:\bat\files"
for /R "%serverPath%\" %%G in (*.*) do (
if %%~zG EQU 0 (
for /R "%backupPath%\" %%g in ("*%%~nxG") do (
if "%%~nxG"=="%%~nxg" (
echo server %%~G %%~zG
echo backup %%~g %%~zg
)
)
)
)
@ENDLOCAL
goto :eof
基本文档参考:
- Windows CMD 命令行的 AZ 索引(附有实用的评论和例子)
- Windows Server 命令行参考(微软官方网站)
注(带直接链接):
set
命令: 等中的括号set "serverPath=D:\Path\files"
可避免变量名称和值中出现不必要的前导或尾随空格FOR /R
循环遍历文件(递归子文件夹);留意参数名称%%G
和%%g
;区分大小写~
参数扩展(修饰符)SETLOCAL
命令- 括号用于将命令拆分到多行(
if
,for
等等) - CLI(批处理)命令据称不支持 UNC 路径。
示例输出。创建了一些子文件夹,每个子文件夹包含 20 个文件,其中两个子文件夹包含一些大小为零(以字节为单位)的文件(模拟错误副本):
==>D:\bat\ServerFault\678871.bat
server D:\Path\files\folder 1\111070290_8 daftar isi.pdf 0
backup D:\bat\files\folder 1\111070290_8 daftar isi.pdf 29
server D:\Path\files\folder 1\111070290_9_daftar_gambar.pdf 0
backup D:\bat\files\folder 1\111070290_9_daftar_gambar.pdf 32
server D:\Path\files\folder 2\111070117_2_lembar_pernyataan_orisinalitas.pdf 0
backup D:\bat\files\folder 2\111070117_2_lembar_pernyataan_orisinalitas.pdf 49
server D:\Path\files\folder 2\111070117_3_lembar_pengesahan.pdf 0
backup D:\bat\files\folder 2\111070117_3_lembar_pengesahan.pdf 36