在 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
。
正在尝试使用 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
。