2017-11-02 8 views
0

ソースディレクトリからターゲットディレクトリに15分ごとにファイルを移動するpowershellスクリプトがあります。約1メガのファイルがSFTPサーバによってソースディレクトリに移動しているので、SFTPクライアントがいつでもファイルを書き込むことができます。Powershellは、まだソースフォルダに書き込まれていない新しいフォルダにファイルを移動します。

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 
+4

ファイルに書き込むアプリケーションは継続的にそれをロックし、それを再オープンしていないでそうされている場合は、PowerShellはそれを自由に移動できます。それはしばらくの間、ファイルが再び書き込まれることを知ることができるようにはありません。ファイルの 'LastWriteTime'を取得し、クライアントが効果的にそれを行うのに十分古くなっている場合にのみ移動する必要があります。 –

+0

これらのファイルに書き込むアプリケーションは、Office製品のように一時ファイルを作成しますか? '〜partialname.docx' – TheIncorrigible1

答えて

0

私はいくつかのことを一緒にcobbling終わったと私はそれを望んでいたとして、この作業を得ました。基本的に私はファイルをループして、ファイルの長さを一度チェックしています...次に秒を待って、ファイルの長さをもう一度チェックして変更されているかどうかを確認します。これはうまくいくようです。それは将来の誰にでも役立つスクリプトのコピーです。

$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 


} 
関連する問題