PowerShell 脚本将文件(但不包括子文件夹)复制到 SFTP,并在完成后移动到子文件夹

2024-04-16

我正在使用以下脚本将文件从本地文件夹复制到 SFTP。上传文件后,我想将文件移动到子文件夹中。我只想上传以下文件C:\Users\Administrator\Desktop\ftp文件夹,而不是其他子文件夹中的文件。

param (
    $backupPath = "C:\Users\Administrator\Desktop\ftp\moved"
)

# Load the Assembly and setup the session properties
try
{
    # Load WinSCP .NET assembly
    Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll" 

    $session = New-Object WinSCP.Session

    $filelist = Get-ChildItem C:\Users\Administrator\Desktop\ftp 

    # Connect And send files, then close session
    try
    {
        # Connect
        $session.Open($sessionOptions)

        $transferOptions = New-Object WinSCP.TransferOptions
        $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary

        foreach ($file in $filelist)
        {
            $transferResult = $session.PutFiles("C:\Users\Administrator\Desktop\ftp\$file", "/", $False, $transferOptions)
            foreach ($transfer in $transferResult.Transfers)
            {
                Write-Host "Upload of $($transfer.FileName) succeeded"
                Move-Item $transfer.FileName $backupPath
            }
        }
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }

    exit 0
}
# Catch any errors
catch
{
    Write-Host "Error: $($_.Exception.Message)"
    exit 1
}

此时,如果我运行脚本下的所有文件moved文件夹也会通过SFTP文件夹上传,我只需要上传根目录下的文件即可ftp folder.

我想我需要在这里更改此行,但不确定如何更改它。

$filelist = Get-ChildItem C:\Users\Administrator\Desktop\ftp 

要跳过文件夹添加-File切换到Get-ChildItem (正如@Scepticalist 已经评论的那样):

$filelist = Get-ChildItem -File C:\Users\Administrator\Desktop\ftp 

尽管您可以使用更少的代码实现相同的目的,但如果您让 WinSCP 迭代文件(并跳过文件夹):

$transferOptions = New-Object WinSCP.TransferOptions
$transferOptions.TransferMode = [WinSCP.TransferMode]::Binary
$transferOptions.FileMask = "|*/" # Exclude the folders

$transferResult = $session.PutFiles(
    "C:\Users\Administrator\Desktop\ftp\*", "/", $False, $transferOptions)
foreach ($transfer in $transferResult.Transfers)
{
    Write-Host "Upload of $($transfer.FileName) succeeded"
    Move-Item $transfer.FileName $backupPath
}

而且你不需要任何Get-ChildItem call.

以上基本上是WinSCP文章中的代码上传成功后将本地文件移至其他位置 https://winscp.net/eng/docs/script_local_move_after_successful_upload,只需一个排除子文件夹 https://winscp.net/eng/docs/faq_script_non_recursive.


但请注意,您的代码(与文章相反)没有成功上传的测试。因此,您甚至可以移动无法上传的文件。确保添加$transfer.Error -eq $Null test.

foreach ($transfer in $transferResult.Transfers)
{
    # Success or error?
    if ($transfer.Error -eq $Null)
    {
        Write-Host "Upload of $($transfer.FileName) succeeded, moving to backup"
        # Upload succeeded, move source file to backup
        Move-Item $transfer.FileName $backupPath
    }
    else
    {
        Write-Host "Upload of $($transfer.FileName) failed: $($transfer.Error.Message)"
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerShell 脚本将文件(但不包括子文件夹)复制到 SFTP,并在完成后移动到子文件夹 的相关文章

随机推荐