我有一个powershell脚本,每15分钟将文件从源目录移动到目标目录。大约1兆字节的文件正由SFTP服务器移动到源目录中......因此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
答案 0 :(得分:0)
我最后拼凑了一些东西,让它按照我的意愿运作。基本上我循环遍历文件并检查文件的长度...然后等待一秒钟并再次检查文件的长度以查看它是否已更改。这似乎运作良好。这是脚本的副本,它可以帮助将来的任何人!
$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
}