2016-07-18 31 views
2

私のスクリプトでは、ディレクトリ名に日付が含まれる毎日自動的に作成されるサブディレクトリのディレクトリをスキャンしようとしています。 yesterdaysの日付が見つかると(前日のアップロードが必要なので)、別のサブディレクトリ、次に「JONES」を含むファイルを探します。これらのファイルが見つかると、winscp.comを使用してアップロードするループがforeachとなります。複数のファイルアップロードを確認するPowerShellのWinSCP XMLログ

私の問題は、winscpから作成した.xmlログを使用して、アップロードを確認するためにユーザーに送信しようとしていることです。問題は、.xmlファイルに最後にアップロードされたファイルのみが含まれていることです。

ここに私のスクリプトです:

# Set yesterday's date (since uploads will happen at 2am) 
$YDate = (Get-Date).AddDays(-1).ToString('MM-dd-yyyy') 

# Find Directory w/ Yesterday's Date in name 
$YesterdayFolder = Get-ChildItem -Path "\\Path\to\server" | Where-Object {$_.FullName.contains($YDate)} 

If ($YesterdayFolder) { 

    #we specify the directory where all files that we want to upload are contained 
    $Dir= $YesterdayFolder 

    #list every sql server trace file 
    $FilesToUpload = Get-ChildItem -Path (Join-Path $YesterdayFolder.FullName "Report") | Where-Object {$_.Name.StartsWith("JONES","CurrentCultureIgnoreCase")} 

    foreach($item in ($FilesToUpload)) 
    { 
      $PutCommand = '& "C:\Program Files (x86)\WinSCP\winscp.com" /command "open ftp://USERNAME:[email protected]:21/dropoff/ -explicitssl" "put """"' + $Item.FullName + '""""" "exit"' 
      Invoke-Expression $PutCommand   
    } 
} Else { 
    #Something Else will go here 
} 

私はそれが私の$PutCommand行はすべてForEachループ内に含まれていますし、それだけでxmlファイルにそれは/終了を接続するたびに上書きされますが、私は持っていなかったことを感じますそのスクリプトを壊す運はどんなものでもありません。

答えて

2

ファイルごとにWinSCPを何度も実行しています。各実行は前の実行のログを上書きします。

代わりにWinSCPを1回だけ呼び出します。各ファイルの再接続を避けると、さらに優れています。

$FilesToUpload = Get-ChildItem -Path (Join-Path $YesterdayFolder.FullName "Report") | 
    Where-Object {$_.Name.StartsWith("JONES","CurrentCultureIgnoreCase")} 

$PutCommand = '& "C:\Program Files (x86)\WinSCP\winscp.com" /command "open ftp://USERNAME:[email protected]:21/dropoff/ -explicitssl" ' 

foreach($item in ($FilesToUpload)) 
{ 
     $PutCommand += '"put """"' + $Item.FullName + '""""" ' 
} 
$PutCommand += '"exit"' 

Invoke-Expression $PutCommand 

あなたが本当にする必要があるすべては、WinSCPの終了コードをチェックしているが。 0の場合、すべて正常に進みました。 XMLログを証明する必要はありません。


さらに良い、ではなく、コマンドラインからのWinSCPを駆動する、WinSCP .NET assembly from PowerShell scriptを使用しています。すべてのエラーチェックが行われます(何か問題が生じた場合は例外が発生します)。そして、コマンドラインの厄介なこと(資格やファイル名に特殊記号をエスケープするなど)を避けてください。

try 
{ 
    # Load WinSCP .NET assembly 
    Add-Type -Path "WinSCPnet.dll" 

    # Setup session options 
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{ 
     Protocol = [WinSCP.Protocol]::Ftp 
     FtpSecure = [WinSCP.FtpSecure]::Explicit 
     TlsHostCertificateFingerprint = "xx:xx:xx:xx:xx:xx..." 
     HostName = "ftps.hostname.com" 
     UserName = "username" 
     Password = "password" 
    } 

    $session = New-Object WinSCP.Session 

    try 
    { 
     # Connect 
     $session.Open($sessionOptions) 

     # Upload files 
     foreach ($item in ($FilesToUpload)) 
     { 
      $session.PutFiles($Item.FullName, "/dropoff/").Check() 
      Write-Host "Upload of $($Item.FullName) succeeded" 
     } 
    } 
    finally 
    { 
     # Disconnect, clean up 
     $session.Dispose() 
    } 

    exit 0 
} 
catch [Exception] 
{ 
    Write-Host "Error: $($_.Exception.Message)" 
    exit 1 
} 
+0

私はあなたの最初の提案を得ることができました。私は今、ネットの提案に取り組むつもりです。私はまだPowershellにはまだ新しいですが、 "If"ステートメントのすべてを置き換えるために投稿した "try"コードを使用しますか? ありがとうございます。 – jms2k

+1

いいえ、ちょうど 'foreach'ループです。 '$ FilesToUpload ='ステートメントを保持します。 –

+0

エラーが発生しました(接続できません)。私はExplicitSSLをする必要があると思いますか? – jms2k

関連する問題