扫描C盘并复制文件

时间:2017-06-08 08:20:19

标签: powershell copy backup restore

我会在这里感谢一些帮助。

  1. Powershell脚本应该关闭有效的Outlook进程。

  2. 以及.pst文件的扫描C盘有效。

  3. 将这些文件复制到“\ fileserver01 \ temp \ test \”

  4. 导出到csv / excel列表,其中包含这些文件的位置和上次写入时间。

  5. 运行脚本时用户可能隐藏错误消息,因为它在运行扫描时抱怨几个文件夹无法完全访问。

  6. 代码:

    Get-Process outlook | Foreach-Object { $_.CloseMainWindow() }
    
    Get-ChildItem -path c:\ -recurse -include *.pst | `
    Copy-Item -destination "\\fileserver01\temp\test\" | `
    Select-object fullname,lastwritetime|export-csv "\\fileserver01\temp\test\"
    

    我应该如何修复列表中的最后几件事? 感谢

5 个答案:

答案 0 :(得分:0)

我认为问题在于复制文件后,对象将从管道中消失。

这有效:

xsl:for-each-group

答案 1 :(得分:0)

首先,您必须对UNC路径使用双反斜杠。 其次,copy-item不会向管道输出任何内容,你必须使用-Passthru参数。

do{
      let doc: Document = try SwiftSoup.parse(responseString!)
      let iconsList: Element = try doc.select("ul.icons-list").first()!
      print(iconsList)
  }catch Exception.Error( _, let message){
      print("icons list not found "+message)
  }catch{
      print("error")
  }

答案 2 :(得分:0)

这并没有直接回答您提出的问题,因为@ Adamar的回答似乎就是这样。

但是,您也可以通过使用以下代码段从注册表中查询ost / pst文件来解决您的问题:

(Get-ChildItem HKCU:\Software\Microsoft\Office\16.0\Outlook\Search).Property | ? {$_ -match "(o|p)st$"}

将返回登录用户在Outlook中打开的所有ost / pst文件。

这样的代码片段会将它们全部复制到网络共享中并将日志打印到文件中。

$FilesToCopy = (Get-ChildItem HKCU:\Software\Microsoft\Office\16.0\Outlook\Search).Property | ? {$_ -match "(o|p)st$"}
$FilesToCopy | ForEach { Copy-Item -Path $_ -Destination "\\network\share" ; $_ | Out-File "\\network\share\log.txt" -Append }

这比通过所有C:驱动器的索引节省了大量时间 - 还有一个问题,即Get-ChildItem非常长的目录名(大于260个字符长)没有被正确编入索引 - 制作对于生产脚本,这种方法更可靠,更具吸引力。

答案 3 :(得分:0)

这是最终的代码。 感谢大家的支持。

#Kill Oulook process
Get-Process outlook -ErrorAction SilentlyContinue |   Foreach-Object { $_.CloseMainWindow() } 

#Scan for .pst files on the C disk
Get-ChildItem -path c:\ -recurse -include *.pst -ErrorAction SilentlyContinue |

#Copy located .pst files to the destination
Copy-Item -Destination "\\networkpath\home\$env:username\ComputerChange\" -Verbose -PassThru -ErrorAction SilentlyContinue | 

#Log where files were located and when they were last written to.
Select-Object fullname,lastwritetime | export-csv \\networkpath\home\$env:username\ComputerChange\PSTlog.csv -Verbose


Write-Host "PST Files have successfully been copied, press any key to close" -ErrorAction SilentlyContinue
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 
end

答案 4 :(得分:0)

所以我创建了一个更快的脚本,因为我已经排除了.PST文件无法保存的一些系统文件夹和程序文件夹。 我打赌你们有些专家可以找出为什么这段代码不起作用?

#Exclude systemfolders etc
$folders=get-childitem c:\ | where-object{$_.mode -like "d-*" -AND $_.name -notlike "windows" -AND $_.name -notlike "drivers" -AND $_.name -notlike "program files*"}

#Search thru each root folder for PST-files
$allfiles=$folders | ForEach-Object{get-childitem -Path $_.fullname -include "*.pst" -recurse -ErrorAction silentlycontinue};

$env:username
$foldertocreate="\\destination\$env:username\"

#Check if folder with username exists in the \\destination folder otherwise create folder with username.       
if((Test-Path -Path $foldertocreate -PathType Container)) {write-host "Folder already created"}

        else {write-host "Creating Folder", New-Item -ItemType Directory -Force -Path $foldertocreate }                              

#Copy .PST files which is in $allfiles to the folder created in fileshare> $foldertocreate.

#Copy .PST files in $allfiles to the destination folder created.
robocopy $allfiles $foldertocreate

Write-Host "Press any key to close" -ErrorAction SilentlyContinue $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 
end