1

サーバー上の最新のファイルをダウンロードする WinSCP PowerShell スクリプトがあります。サーバー上のすべてのファイルタイプの最新のファイルをダウンロードするように調整したいと思います。

ファイルの拡張子をfilename.txt( example.al-> al.txt) として各ファイルに名前を付けるためのボーナス ポイント。これが私のコードです:

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

    # Get list of files in the directory
    $directoryInfo = $session.ListDirectory($remotePath)

    # Select the most recent file
    $latest =
        $directoryInfo.Files |
        Where-Object { -Not $_.IsDirectory } |
        Sort-Object LastWriteTime -Descending |
        Select-Object -First 1

    $extension = [System.IO.Path]::GetExtension($latest.Name)
    "GetExtension('{0}') returns '{1}'" -f $fileName, $extension

    # Any file at all?
    if ($latest -eq $Null)
    {
        Write-Host "No file found"
        exit 1
    }

    # Download the selected file
    $session.GetFiles($session.EscapeFileMask($remotePath + $latest.Name), $localPath + $extension).Check()

現在、ファイルを として保存していますが.extension、私が望むのはextension.txt.

ありがとう!

編集:

このコードを試してみると、サーバー上のすべてのファイルがダウンロードされました。

$session = New-Object WinSCP.Session

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

    # Get list of files in the directory
    $directoryInfo = $session.ListDirectory($remotePath)

    # Select the most recent file
    $latest = $directoryInfo.Files |
        Where-Object { -Not $_.IsDirectory } | 
        Group-Object Extension | 
        ForEach-Object { 
            $_.Group | Sort-Object LastWriteTime -Descending | Select -First 1
            $session.GetFiles($session.EscapeFileMask($remotePath + $_.Name), $localPath).Check()
    }

    $extension = [System.IO.Path]::GetExtension($latest.Name)
    "GetExtension('{0}') returns '{1}'" -f $fileName, $extension

    # Any file at all?
    if ($latest -eq $Null)
    {
        Write-Host "No file found"
        exit 1
    }

    # Download the selected file
}
finally
{
    # Disconnect, clean up
    $session.Dispose()
}
4

1 に答える 1

1

最初の部分は で簡単Group-Objectです。それを使用して拡張子でグループ化し、各グループから右に 1 つ引き出します。

$latest = $directoryInfo.Files |
    Where-Object { -Not $_.IsDirectory } | 
    Group-Object { [System.IO.Path]::GetExtension($_.Name) } | 
    ForEach-Object{ 
        $_.Group | Sort-Object LastWriteTime -Descending | Select -First 1
    }

次に、各拡張機能のキングを処理してダウンロードします。同じループでこれを行うこともできますが、別のループで行います。は、個別の拡張機能をまだ考慮していません

$latest | ForEach-Object{
    $session.GetFiles($session.EscapeFileMask($remotePath + $_.Name), $localPath + $extension).Check()
}

拡張部分で何が必要かについては少し曖昧ですが、そのためにはループ内の拡張ロジックも必要です。

$latest | ForEach-Object{
    $extension = ([System.IO.Path]::GetExtension($_.Name)).Trim(".")
    $session.GetFiles($session.EscapeFileMask($remotePath + $_.Name), "$localPath\$extension.txt" ).Check()
}
于 2015-10-01T19:27:05.947 に答える