Windows-Server-2012-R2

如何在使用時在 PowerShell 中復製文件?

  • May 11, 2022

我需要從遠端 Windows 2012 伺服器複製日誌文件。我們的應用程序將不斷地寫入日誌文件。我知道如何使用Copy-ItemCmdlet 複製遠端文件。但我說錯了cannot access the file, because it is being used by another process。即使正在使用文件,是否有任何方法可以獲取文件。目前我將RDC放入機器並複制它。我每小時對已經編寫腳本的日誌進行分析,只是這個日誌文件獲取過程是手動的。

正如@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

我想使用純 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 將文件內容從一台主機流式傳輸到本地電腦

引用自:https://serverfault.com/questions/954231