Powershell Remote Copy失败,在本地工作

时间:2018-02-27 14:04:25

标签: powershell powershell-remoting

我们在不同位置的服务器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在远程运行时表现不同,我们可以修复"它的行为因此它远程复制日志。

2 个答案:

答案 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