我需要从远程 Windows 2012 服务器复制日志文件。我们的应用程序将不断写入日志文件。我知道如何使用Copy-Item
Cmdlet 复制远程文件。但我收到错误消息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 将文件内容从一台主机流式传输到本地计算机