如何在 PowerShell 中使用文件时复制它?

如何在 PowerShell 中使用文件时复制它?

我需要从远程 Windows 2012 服务器复制日志文件。我们的应用程序将不断写入日志文件。我知道如何使用Copy-ItemCmdlet 复制远程文件。但我收到错误消息cannot access the file, because it is being used by another process。有没有办法获取正在使用的文件。目前我将 RDC 连接到机器并复制它。我每小时对日志进行一次分析,该分析已编写脚本,只是这个日志文件获取过程是手动的。

答案1

正如@Zoredache 和@Matthew Wetmore 所建议的,我已经尝试过了Robocopy

我创建了一个新的驱动器来New-PSDrive映射远程文件夹,并Robocopy在写入时复制所需的日志文件:

New-PSDrive -Name Logs -Root \\Svr01\d$\data -PSProvider Filesystem -Credentiaal $cred
Set-Location Logs:
robocopy .\logfiles\ ~\desktop\ service1.log /E

service1.log1这会将文件从远程服务器复制Svr01到我的本地桌面。

感谢@Zoredache 和@Matthew Wetmore

答案2

我想使用纯 powershell 解决方案,这就是我想出的:

function Copy-Logs {
  [CmdletBinding()]
  param(
    [pscredential]$Credentials,
    $SourceDir,
    $SourceComputers
  )
  $SourceComputers `
  | ForEach-Object {
    $hostname = $_;
    "processing host: " + $hostname | Write-Verbose
    mkdir $hostname -ErrorAction SilentlyContinue | Out-Null
    $pssession = New-PSSession -Credential $Credentials -ComputerName $hostname;
    $fileInfos = Invoke-Command `
      -Session $pssession `
      -ScriptBlock { Get-ChildItem $args } `
      -ArgumentList $SourceDir
    $fileInfos `
    | ForEach-Object {
      $fileInfo = $_;
      $destFile = "$($hostname)/$($fileInfo.Name)"
      "copying file: $($fileInfo.FullName) to $($destFile)" | Write-Verbose
      Invoke-Command `
        -Session $pssession `
        -ScriptBlock { Get-Content $args; } `
        -ArgumentList $fileInfo.Fullname `
        > $destFile
    }
  }
}

它使用 Get-Content 将文件内容从一台主机流式传输到本地计算机

相关内容