2

У клиента есть управляемый веб-сервер; на этом сервере находится скрипт электронной коммерции, и часть скрипта каждую неделю создает резервную копию. Резервная копия хранится на веб-сервере (не в HTTP-маршруте). Интернет-провайдер берет копию, и мои клиенты тоже хотят взять копию.

То, что я пытаюсь сделать, это перед загрузкой файла, который я хочу иметь возможность рассчитать размер каталога резервного копирования - но единственный доступ, который я имею, это через SFTP. Можно ли легко получить размер каталога, а затем использовать его в скрипте PowerShell.

ПРИМЕЧАНИЕ. Я написал сценарий автоматической загрузки в PowerShell и хочу его расширить.

Извините, если это звучит расплывчато, я могу предоставить дополнительную информацию, если у вас есть какие-либо конкретные вопросы.

2 ответа2

1

Это легко с WinSCP .NET сборкой и ее Session.EnumerateRemoteFiles:

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

# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    HostName = "host"
    UserName = "user"
    Password = "password"
    SshHostKeyFingerprint = "fingerprint"
}

Write-Host "Connecting..."
$session = New-Object WinSCP.Session
$session.Open($sessionOptions)

Write-Host "Calculating..."
$sum =
    $session.EnumerateRemoteFiles(
        "/remote/path", $Null, [WinSCP.EnumerationOptions]::AllDirectories) |
    Measure-Object -Property Length -Sum
Write-Host "Size is $($sum.Sum)"

(Я автор WinSCP)

0

Я добавил обходной путь, и с помощью PHP я запрашиваю размер каталога на сервере - тогда я могу получить информацию, используя скрипт powershell.

PHP скрипт для захвата размера файла

<?php
$f = 'PATH FROM LINUX ROOT TO DIRECTORY YOU WANT SIZE OF';
    $io = popen ( '/usr/bin/du -sk ' . $f, 'r' );
    $size = fgets ( $io, 4096);
    $size = substr ( $size, 0, strpos ( $size, "\t" ) );
    pclose ( $io );
    echo 'Backup Size: ' . $f . ' => Size: <h3>' . $size . '</h3>';

?>

Powershell для получения размера файла из скрипта PHP:

$url = 'PATH TO PHP FILE SIZE SCRIPT'
$pattern =  '(?i)<h3[^>]*>(.*)</h3>'

$webclient = New-Object System.Net.WebClient
$html = $webclient.DownloadString($url)


$result = [Regex]::Matches($html, $pattern)

$result | ForEach-Object {
  [int]$remoteSize =  $_.Groups[1].Value
}

# Correct the disc size (-332)

$remoteSize -=332

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .