我有一个在 Windows Server 2008 R2 64 位上运行的 PowerShell 2.0 脚本,它将一些 Hyper-V .vhd 文件复制到另一台服务器作为“备份解决方案”。
该脚本获取要复制的 .vhd 列表,然后遍历该列表以使用 Copy-Item 复制它们。它还将一些日志信息写入文件。文件被复制到另一台服务器(Windows Server 2003 Sp2)中,并放入使用 NTFS 压缩的目录中。
其中一个文件未复制。它相对较大~68GB。其他文件为20GB或更小。奇怪的是,在复制过程中,文件出现在目标服务器上,并且由于日志文件条目的时间差异,生成的日志文件似乎表明文件已被复制。
我在日志文件中没有看到任何错误消息,在两台机器的事件日志中也没有看到任何消息。
这是执行复制的代码。
Get-ChildItem $VMSource *.vhd -Recurse | foreach-object {
$time = Get-Date -format HH.mm.ss
Add-Content $logFileName "$time : File Copy ($_) started"
$fullname = $_.FullName
Add-Content $logFileName "$time : Copying $fullname to $VMDestination"
Copy-Item $fullname $VMDestination -Force -ErrorAction SilentlyContinue -ErrorVariable errors
foreach($error in $errors)
{
if ($error.Exception -ne $null)
{
Add-Content $logFileName "'tERROR COPYING FILE : $($error.Exception)"
}
}
$time = Get-Date -format HH.mm.ss
Add-Content $logFileName "$time : File Copy ($_) finished"
}
我只能认为将这么大的文件复制到压缩目录可能会出现一些问题?有什么想法吗?
答案1
问题在于该文件的复制。我尝试在 Explorer 中复制该文件,大约一小时后失败,并出现错误,指出该文件的一部分已被另一个进程锁定。
我最终修改了脚本,在将文件移动到目标位置之前对其进行了压缩。脚本现在可以成功运行,尽管耗时更长。
对于任何答案,都表示感谢。
答案2
您需要检查 -errorvariable 选项。如果您使用 +errors 而不是 -errors,您可能会检索到其他错误。