在 PowerShell 中使用 WinSCP 将 FTP 与本地目录进行比较

Using WinSCP in PowerShell to compare FTP to local directories

正在尝试使用 WinSCP 和 PowerShell 列出远程目录和本地目录,比较最低级别,然后转移本地缺少的远程目录。

列表适用于远程和本地,但比较 -contains 运算符显示 false 即使当我 Write-Host$fileInfo 时看起来它们应该匹配。我尝试将 $fileInfo 添加到数组中进行比较,但它不仅仅是最低目录,如目录的属性和其他内容。

$localpath = "C:\Users"
$remotePath = "/home"

Add-Type -Path "WinSCPnet.dll"

$localfolders = Get-ChildItem $localpath

$localtargets = @()
$remotetargets = @()

foreach ($f in $localfolders){
    $split = $f.FullName  -split '\'
    $localtargets += $split[$split.Count-1]
}

$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Ftp
    HostName = "ftp.com"
    UserName = "user"
    Password = "password"
}

$session = New-Object WinSCP.Session

try
{
    $session.Open($sessionOptions)

    $fileInfos = $session.ListDirectory($remotePath)
    
    foreach ($fileInfo in $fileInfos.Files)
    {
        Write-Host $localtargets.Contains($fileInfo)                       
        $remotetargets += $fileInfo | Out-String   
    }
}

据我所知,$localtargets 只是一个表示文件名的字符串列表,所以你应该只测试它是否包含文件名,在你的最后一个循环中,你能测试一下吗:

Write-Host $localtargets.Contains($fileInfo.Name)

@JPBlack 的 post 正确回答了您的字面问题。

不过请注意,WinSCP .NET 程序集可以使用 Session.SynchronizeDirectories:

自行同步您的文件夹
$session.Open($sessionOptions)

$session.SynchronizeDirectories(
    [WinSCP.SynchronizationMode]::Local, $localpath, $remotePath, $False).Check()

或者,如果您只是想找出差异,请使用 Session.CompareDirectories