我们在不同位置的服务器A上有日志文件(没有UNC路径访问权限),我们希望将文件复制到服务器B.这成功地与Copy-Item -FromSession
(在服务器B上运行)一起使用,只要文件已关闭。因此,我们可以成功复制前一天的日志,但不能复制今天的日志。
$cred = Get-OurUserCredentials
$sess = New-PSSession -ComputerName $ServerA -Credential $cred -Authentication Negotiate
$LogFile = "D:\log\tomcat\access.20180227.log"
Copy-Item -FromSession $sess $LogFile "D:\logs\tomcat\" -Force
但是,如果我们在服务器A上本地运行Copy-Item
,我们可以在本地复制今天的活动日志。它仅在服务器B上Copy-Item -FromSession
失败并且:
Copy-Item:进程无法访问文件' D:\ log \ tomcat \ access.20180227.log'因为它正被另一个进程使用。 在行:11 char:2
作为一种解决方法,我们可以在服务器A上创建一个本地任务来创建本地副本,但为什么这是必要的呢?
为什么Copy-Item在远程运行时表现不同,我们可以修复"它的行为因此它远程复制日志。
答案 0 :(得分:1)
OP中提出的答案的一个版本,但避免了对计划任务的需要。
$cred = Get-OurUserCredentials
$sess = New-PSSession -ComputerName $ServerA -Credential $cred -Authentication Negotiate
#ScriptBlock to copy file locally
$SB =
{
#Create variables on the remote machine avoid havin gto pass to scriptblock
$LogFile = "D:\log\tomcat\access.20180227.log"
$TempDes = "temporarylocationhere"
Copy-Item -Path $LogFile -Destination $Des
}
#optional scriptblock to clean up
$SB2 =
{
Remove-Item -Path $TempDes -force
}
#Run the copy file scriptblock
Invoke-Command -Session $sess -ScriptBlock $SB
#Copy file
Copy-Item -FromSession $sess $TempDes "D:\logs\tomcat\" -Force #"
#Run clean up scriptblock
Invoke-Command -Session $sess -ScriptBlock $SB2
答案 1 :(得分:0)
您是否考虑使用PSDrive
映射远程位置,然后将文件复制到该驱动器或从该驱动器复制文件?
New-PSDrive cmdlet创建临时和永久驱动器 映射到数据存储中的位置或与数据存储中的位置相关联,例如 网络驱动器,本地计算机上的目录或注册表项, 与之关联的持久Windows映射网络驱动器 远程计算机上的文件系统位置。
使用您的代码的示例:
# Change the ServerNameToCopyTo below
New-PSDrive -Name "Remote" -PSProvider "FileSystem" -Root "\\ServerNameToCopyTo\log\tomcat\"
$LogFile = "D:\log\tomcat\access.20180227.log"
Copy-Item $LogFile "Remote:\" -Force