【问题标题】:How can i create a powershell script to move thousands of log files from one location to another?如何创建一个 powershell 脚本来将数千个日志文件从一个位置移动到另一个位置?
【发布时间】:2016-06-13 00:00:54
【问题描述】:

我在服务器上有一个文件夹,其中包含数千个日志文件。每秒都在填充新文件,并且文件夹继续增长。每周一次,我想获取这些文件,将它们复制并粘贴到另一个文件夹中。然后我将运行一个 python 脚本来处理新文件夹中的日志。我的脚本每周处理大约 70K 日志,需要一个多小时。

我怎样才能让它更高效/更快?

$ScriptProperties = @{
    "FolderDir" = "\\server\folder1\Temp";
    "FolderName" = "Orignal_Folder";
    "OldFolderName" = "New_Folder";
    "TempFolderName" = "Temp_Folder";



}

#$DateStamp = get-date -uformat "%Y-%m-%d@%H-%M-%S"

# if (Test-Path "$($ScriptProperties.FolderDir)\$($ScriptProperties.FolderName)"){
#   #write-host "$($ScriptProperties.FolderDir)\$($ScriptProperties.FolderName)   folder folder"
#   Copy-Item -Path "$($ScriptProperties.FolderDir)\$($ScriptProperties.FolderName)" -Destination "$($ScriptProperties.FolderDir)\$($ScriptProperties.OldFolderName)-$($DateStamp)" -force -recurse
#   #New-Item -Path "$($ScriptProperties.FolderDir)\$($ScriptProperties.FolderName)" -type directory -force
# }#else{
#   #write-host "folder not found."
#   New-Item -Path "$($ScriptProperties.FolderDir)\$($ScriptProperties.FolderName)" -type directory
#}

write-host "Start"


if (Test-Path "$($ScriptProperties.FolderDir)\$($ScriptProperties.FolderName)"){
    #Renaming folder to Temp directory
    Rename-Item "$($ScriptProperties.FolderDir)\$($ScriptProperties.FolderName)" -NewName "$($ScriptProperties.FolderDir)\$($ScriptProperties.TempFolderName)"

    #Creating new Log directory
    New-Item -Path "$($ScriptProperties.FolderDir)\$($ScriptProperties.FolderName)" -type directory

    #Creating new Move folder if not found
    if (-Not (Test-Path "$($ScriptProperties.FolderDir)\$($ScriptProperties.OldFolderName)")) {New-Item -Path "$($ScriptProperties.FolderDir)\$($ScriptProperties.OldFolderName)" -type directory -force}
    #Moving content to move directory
    Move-Item -Path "$($ScriptProperties.FolderDir)\$($ScriptProperties.TempFolderName)\*.*" -Destination "$($ScriptProperties.FolderDir)\$($ScriptProperties.OldFolderName)" -force 
    #Removing temp directory
    Remove-Item "$($ScriptProperties.FolderDir)\$($ScriptProperties.TempFolderName)" -Force

}


write-host "Complete"

【问题讨论】:

  • 您正在寻找robocopy
  • 这取决于你的瓶颈在哪里。如果您的瓶颈是网络,那么传输更少的数据或以更少的开销传输数据会有所帮助。如果瓶颈是源或目标 CPU、内存或 I/O(即 PCIe)通道,那么您需要改善服务器上的情况(减少负载或增加服务器容量)。假设它是网络,那么压缩日志文件将显着减少要传输的数据量(日志文件是高度可压缩的)。为了最有效,服务器不能太接近 CPU 的全部利用率。
  • Ansgar- 我一直在测试 robocopy。我测试了移动 600 个文件,大约需要 1:00 分钟。在生产中,我将移动大约 70K-80K 文件,根据我的测试,这大约需要 2 小时。速度很重要,但也许这是我能做的最好的了。
  • Xpw- 我认为两者兼而有之。目的地的来源可能没有足够的容量,但增加它不是一个有成本的选择。网络也可能很慢。我试过压缩文件夹,但也需要一个多小时。
  • 传输数以万计的文件需要时间,无论您采用哪种方式。

标签: python powershell logging copy-paste large-data-volumes


【解决方案1】:

@Ansgar 推荐 robocopy;为什么?!你已经在使用 PowerShell,如果可以避免的话,不要回到十年前使用 cmd 和批处理脚本!

另外,小心移动!如果某些事情中断了您的传输,则您的数据已损坏或丢失。您甚至没有检查您传输的文件是否大小相等;如果失败了怎么办?在这里,您无论如何都将其删除。我会考虑添加某种逻辑来检查复制前后的文件大小。

考虑使用 BITS 传输来避免这种情况,并在确认文件大小相等后删除您移动的文件。另一个好处是,如果由于任何原因中断,它将从您中断的地方继续您的副本。

您可以执行异步操作并可能在复制完成之前开始处理数据。这应该为您提供有关您拥有的选项的更多详细信息:https://msdn.microsoft.com/en-us/library/ee663885(v=vs.85).aspx。这是 Start-BitsTransfer Cmdlet 的 TechNet 页面:https://technet.microsoft.com/en-us/library/dd819420.aspx,供语法和参数选项参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多