0

リモートサーバーがあり、1日に1つのファイルがアップロードされます。ファイルがいつアップロードされるかわかりません。このファイルを処理するために別のサーバーにコピーする必要があり、ファイルごとに1回だけ(1日1回)これを行う必要があります。ファイルをリモートサーバーにアップロードする場合、1時間以内にコピーする必要があるため、このスクリプトを少なくとも1時間に1回実行する必要があります。私はこのスクリプトを使用しています:

# Get yesterday date
$date = (Get-Date).Adddays(-1) | Get-Date -Format yyyyMMdd
$check = ""
$check = Get-Content c:\checkiftransfered.txt

# Test if file checkiftransfered.txt contains True or False. If it contains True, file for this day was already copyied
if ($check -ne "True") {
    #Test if file exists - it has specific name and yesterday date
    if(Test-Path \\remoteserver\folder\abc_$date.xls) {

        Copy-Item \\remoteserver\folder\abc_$date.xls \\remoteserver2\folder\abc_$date.xls
        # Write down information that file was already copyied
        $check = "True" | Out-File c:\checkiftransfered.txt

    } else { Write-Host "File has not been uploaded."}
} else { Write-Host "File has been copyied."}
# + I will need another script that will delete the checkiftransfered.txt at 0:00

それはうまくいくと思いますが、私はもっとエレガントな解決策を探しています-それを解決するための最良の方法です。ありがとうございました

4

2 に答える 2

4

PowerShell V3 にTest-Pathは便利なパラメータ-NewerThan-OlderThanパラメータがあるため、次のように簡略化できます。

$yesterday = (Get-Date).AddDays(-1)
$date = $yesterday | Get-Date -Format yyyyMMdd
$path = "\\remoteserver\folder\abc_$date.xls"
if (Test-Path $path -NewerThan $yesterday) 
{
    Copy-Item $path \\remoteserver2\folder\abc_$date.xls -Verbose
    (Get-Item $path).LastWriteTime = $yesterday
}

これにより、LastWriteTime を使用して別の場所でコピー ステータスを追跡する必要がなくなります。と を一緒に使用-NewerThan-OlderThanないでください。期待どおりに動作しません。

そして、いくつかの優れたネイティブ ツールを忘れないように、robocopy を使用したソリューションを次に示します。

robocopy $srcdir $destdir /maxage:1 /mot:60

この/mot:nオプションにより、robocopy はソース ディレクトリを継続的に監視します (上記で指定したように 60 分ごと)。

于 2012-10-08T16:14:50.320 に答える
2

はるかに簡単で信頼性の高い方法があります。FileSystemWatcherクラスを使用できます。

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = 'C:\Uploads'
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
$created = Register-ObjectEvent $watcher "Created" -Action {
  Sleep (30*60)
  Copy-Item $($eventArgs.FullPath) '\\remoteserver2\folder\'
}

ここで行っていることを見てみましょう。新しいウォッチャーを作成し、新しいファイルが C:\Uploads にアップロードされると、ファイル システムがフレームワークを介してプログラムに通知を送信し、C:\Uploads を監視するように指示します。イベントを作成しました。その場合、アップロードが完了するまで 30 分間スリープするようにプログラムに指示し (アップロードのサイズによっては長すぎる場合があります) Copy-Item、新しいファイルへのフル パスを含むイベント引数を呼び出します。 .

ちなみに、これを PowerShell ウィンドウに貼り付けてサーバー上で開いたままにする必要があります。代わりに、ISE を使用して開いたままにすることもできます。いずれにせよ、現在持っているものよりも信頼性が高くなります。

于 2012-10-08T16:24:18.757 に答える