Powershell将尚未写入源文件夹的文件移动到新文件夹

Powershell将尚未写入源文件夹的文件移动到新文件夹,powershell,Powershell,我有一个powershell脚本,它每15分钟将文件从源目录移动到目标目录。SFTP服务器正在将大约1兆的文件移动到源目录中。。。因此,SFTP客户端可以随时写入文件 Move Item命令正在移动文件,但是它似乎在移动文件时没有确保文件仍在写入(正在使用?) 我需要一些帮助来找到一种方法,将文件从源文件写入目标文件,并确保整个文件都到达目标文件。有人在使用Powershell之前遇到过此问题吗 我搜索并能够找到一些函数,它们说它们解决了问题,但当我尝试它们时,我没有看到相同的结果 现有Powe

我有一个powershell脚本,它每15分钟将文件从源目录移动到目标目录。SFTP服务器正在将大约1兆的文件移动到源目录中。。。因此,SFTP客户端可以随时写入文件

Move Item命令正在移动文件,但是它似乎在移动文件时没有确保文件仍在写入(正在使用?)

我需要一些帮助来找到一种方法,将文件从源文件写入目标文件,并确保整个文件都到达目标文件。有人在使用Powershell之前遇到过此问题吗

我搜索并能够找到一些函数,它们说它们解决了问题,但当我尝试它们时,我没有看到相同的结果

现有PowerShell脚本如下所示:

Move-Item "E:\SFTP_Server\UserFolder\*.*" "H:\TargetFolder\" -Verbose -Force *>&1 | Out-File -FilePath E:\Powershell_Scripts\LOGS\MoveFilesToTarget-$(get-date -f yyyy-MM-dd-HH-mm-ss).txt

最后,我拼凑了一些东西,并按照自己的意愿完成了这项工作。基本上我是在文件中循环,检查文件的长度一次。。。然后等待一秒钟,再次检查文件的长度,看看是否已更改。这似乎很有效。这里有一份脚本副本,以防将来对任何人都有帮助

$logfile ="H:\WriteTest\LogFile_$(get-date -format `"yyyyMMdd_hhmmsstt`").txt"

function log($string, $color)
{
if ($Color -eq $null) {$color = "white"}
write-host $string -foregroundcolor $color
$string | out-file -Filepath $logfile -append
}

$SourcePath = "E:\SFTP_Server\UserFolder\"
$TargetPath = "H:\TargetFolder\"
$Stuff = Get-ChildItem "$SourcePath\*.*" | select name, fullname


ForEach($I in $Stuff){
log "Starting to process $I.name" green

$newfile = $TargetPath + $I.name

$LastLength = 1
$NewLength = (Get-Item $I.fullname).length

while ($NewLength -ne $LastLength) {
    $LastLength = $NewLength
    Start-Sleep -Seconds 1
    log "Waiting 1 Second" green
    $NewLength = (Get-Item $I.fullname).length
    log "Current File Length = $NewLength" green
}
log "File Not In Use - Ready To Move!" green
Move-Item $I.fullname $TargetPath


}

如果应用程序通过不断重新打开文件而不是锁定文件来写入文件,PowerShell可以自由移动文件。它不可能知道,在短时间内,该文件将再次写入。你必须做一些事情,比如获取文件的
LastWriteTime
,并且只有当它“足够老”以便客户端有效地使用它时才移动它。应用程序写入这些文件是否会像Office产品那样创建临时文件<代码>~partialname.docx