locked
powershell Remove-FTPItem RRS feed

  • Вопрос

  • Здравствуйте.

    Подскажите пожалуйста как справиться с этим командлетом Remove-FTPItem

    Мне надо чтоб он удалял только файлы и не затрагивал папки в которых надо удалить файлы, а по описанию я так понял он при удаление файлов затронет и папки :(

    11 июня 2013 г. 6:42

Ответы

  • Протестировал, все отрабатывает, как надо.

    $ftpServer = "ftp://ftpserver.org"
    $username = "Login"
    $password = ConvertTo-SecureString 'Password' -Force -AsPlainText
    $FtpPath = "/Report/31/"
    $File = "*.zip"
    $credentials = New-Object System.Management.Automation.PSCredential($username, $password)
    Set-FTPConnection -Credentials $credentials -Server ftp://ftpserver.org -Session ftpServerS -UsePassive 
    
    $Session = Get-FTPConnection -Session ftpServerS
    
    
    Get-FTPChildItem -path $FtpPath | Get-FTPItem -localpath $FullPath -Verbose
    Get-FTPChildItem -Session $Session -Path $FtpPath -Recurse | Where {$_.Dir -ne "dir" -and $_.Name -like "$File*"} | Remove-FTPItem -Session $Session  
    

    Результат:

    PS > Get-FTPChildItem -Session $Session -Path $FtpPath -Recurse | Where {$_.dir -ne "dir" -and $_.
    Name -like "$file*"}
    
    
       Parent: ftp://10.0.0.1/Report/31
    
    Dir Right     Ln  User   Group  Size   ModifiedDate        Name
    --- -----     --  ----   -----  ----   ------------        ----
    -                               0B     06-13-13  01:51AM   1.zip
    -                               0B     06-13-13  01:51AM   3.zip
    
    
       Parent: ftp://10.0.0.1/Report/31/123
    
    Dir Right     Ln  User   Group  Size   ModifiedDate        Name
    --- -----     --  ----   -----  ----   ------------        ----
    -                               0B     06-13-13  02:19AM   d.zip
    
    
    PS > Get-FTPChildItem -Session $Session -Path $FtpPath -Recurse | Where {$_.Dir -ne "dir" -and $_.
    Name -like "$File*"} | Remove-FTPItem -Session $Session
    ->Remove File: ftp://10.0.0.1/Report/31/1.zip
    250 DELE command successful.
    
    ->Remove File: ftp://10.0.0.1/Report/31/3.zip
    250 DELE command successful.
    
    ->Remove File: ftp://10.0.0.1/Report/31/123/d.zip
    250 DELE command successful.
    
    PS > Get-FTPChildItem -Session $Session -Path $FtpPath -Recurse | Where {$_.dir -ne "dir" -and $_.
    Name -like "$file*"}
    PS > Get-FTPChildItem -Session $Session -Path $FtpPath -Recurse
    
    
       Parent: ftp://10.0.0.1/Report/31
    
    Dir Right     Ln  User   Group  Size   ModifiedDate        Name
    --- -----     --  ----   -----  ----   ------------        ----
    DIR                                    06-13-13  02:25AM   123

    • Помечено в качестве ответа Kalaputsa 13 июня 2013 г. 10:14
    13 июня 2013 г. 9:33
    Отвечающий

Все ответы

  • Попробуйте так:
    Get-FTPChildItem -Session $Session -Path /TestRootDir -Filter TestF* | Where {$_.Dir -ne "d"} |  Remove-FTPItem -Session $Session 

    • Изменено KazunEditor 11 июня 2013 г. 6:49
    11 июня 2013 г. 6:47
    Отвечающий
  • У меня вопрос вот с этой частью

    Where {$_.Dir -ne "d"}

    А именно с оператором -ne - что он делает?

    P.S. Извините за столь нубский вопрос, но с пошем я пока на ВЫ :(

    11 июня 2013 г. 8:50
  • PS > "-","d","x" -ne "d"
    -
    x

    get-help about_Comparison_Operators

    -ne : Not equal to. Includes a different value.(Для нашего случая, если значение d - каталог,то исключаем его)

    11 июня 2013 г. 9:02
    Отвечающий
  • Что-то совсем плохо :(

    Вот часть кода

    $ftpServer = "ftp://"
    $username = "Login"
    $password = ConvertTo-SecureString 'Password' -Force -AsPlainText
    $FtpPath = "/Report/31/"
    $File = "*.zip"
    $credentials = New-Object System.Management.Automation.PSCredential($username, $password)
    
    Set-FTPConnection -Credentials $credentials -Server $ftpServer -UsePassive -UseBinary 
    Get-FTPChildItem -path $FtpPath | Get-FTPItem -localpath $FullPath -Verbose
    Get-FTPChildItem -Session $credentials -Path $FtpPath -Filter $File | Where {$_.Dir -ne "/Report/31/"} |  Remove-FTPItem -Session $credentials  
    

    Соединение и скачивание файлов проходит нормально, а вот когда начинается удаление выскакивают ошибки

    Исключение при вызове "Create" с "1" аргументами: "Недопустимый URI: Невозможно определить формат URI."
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPItemSize.ps1:80 знак:4
    +             [System.Net.FtpWebRequest]$Request = [System.Net.WebRequest]::Create($Request ...
    +    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : UriFormatException
     
    Не удается найти свойство "Credentials" для данного объекта; убедитесь, что оно существует и является устанавливаемым.
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPItemSize.ps1:81 знак:4
    +             $Request.Credentials = $CurrentSession.Credentials
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
     
    Не удается найти свойство "EnableSsl" для данного объекта; убедитесь, что оно существует и является устанавливаемым.
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPItemSize.ps1:82 знак:4
    +             $Request.EnableSsl = $CurrentSession.EnableSsl
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
     
    Не удается найти свойство "KeepAlive" для данного объекта; убедитесь, что оно существует и является устанавливаемым.
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPItemSize.ps1:83 знак:4
    +             $Request.KeepAlive = $CurrentSession.KeepAlive
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
     
    Не удается найти свойство "UseBinary" для данного объекта; убедитесь, что оно существует и является устанавливаемым.
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPItemSize.ps1:84 знак:4
    +             $Request.UseBinary = $CurrentSession.UseBinary
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
     
    Не удается найти свойство "UsePassive" для данного объекта; убедитесь, что оно существует и является устанавливаемым.
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPItemSize.ps1:85 знак:4
    +             $Request.UsePassive = $CurrentSession.UsePassive
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
     
    Не удается найти свойство "Method" для данного объекта; убедитесь, что оно существует и является устанавливаемым.
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPItemSize.ps1:87 знак:4
    +             $Request.Method = [System.Net.WebRequestMethods+FTP]::GetFileSize
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
     
    Исключение при вызове "Create" с "1" аргументами: "Недопустимый URI: Невозможно определить формат URI."
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPChildItem.ps1:179 знак:4
    +             [System.Net.FtpWebRequest]$Request = [System.Net.WebRequest]::Create($Request ...
    +    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : UriFormatException
     
    Не удается найти свойство "Credentials" для данного объекта; убедитесь, что оно существует и является устанавливаемым.
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPChildItem.ps1:180 знак:4
    +             $Request.Credentials = $CurrentSession.Credentials
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
     
    Не удается найти свойство "EnableSsl" для данного объекта; убедитесь, что оно существует и является устанавливаемым.
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPChildItem.ps1:181 знак:4
    +             $Request.EnableSsl = $CurrentSession.EnableSsl
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
     
    Не удается найти свойство "KeepAlive" для данного объекта; убедитесь, что оно существует и является устанавливаемым.
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPChildItem.ps1:182 знак:4
    +             $Request.KeepAlive = $CurrentSession.KeepAlive
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
     
    Не удается найти свойство "UseBinary" для данного объекта; убедитесь, что оно существует и является устанавливаемым.
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPChildItem.ps1:183 знак:4
    +             $Request.UseBinary = $CurrentSession.UseBinary
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
     
    Не удается найти свойство "UsePassive" для данного объекта; убедитесь, что оно существует и является устанавливаемым.
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPChildItem.ps1:184 знак:4
    +             $Request.UsePassive = $CurrentSession.UsePassive
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
     
    Не удается найти свойство "Method" для данного объекта; убедитесь, что оно существует и является устанавливаемым.
    C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSFTP\Get-FTPChildItem.ps1:186 знак:4
    +             $Request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectoryDetails
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : PropertyNotFound
     
    Get-FTPChildItem : Невозможно вызвать метод для выражения со значением NULL.
    D:\script\powershell\REPORTS.ps1:24 знак:1
    + Get-FTPChildItem -Session $credentials -Path $FtpPath -Filter $File | Where {$_. ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
        + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Get-FTPChildItem

    11 июня 2013 г. 10:22
  • А где сессия? Причем тут $credentials ?

    Set-FTPConnection -Credentials mgajda -Server ftp://ftp.server.org -Session MyTestSession -UsePassive 
    $Session = Get-FTPConnection -Session MyTestSession 

    Зачем добавлять с ошибками?

    Where {$_.Dir -ne "/Report/31/"} - Где я привел такое?

    Должно быть:

    Where {$_.Dir -ne "d" -and $_.Name -ne "/Report/31/"}


    11 июня 2013 г. 10:40
    Отвечающий
  • Hе удаляет и не ругается :(

    $ftpServer = "ftp://ftpserver.org"
    $username = "Login"
    $password = ConvertTo-SecureString 'password' -Force -AsPlainText
    $FtpPath = "/Report/31/"
    $File = "*.zip"
    $credentials = New-Object System.Management.Automation.PSCredential($username, $password)
    Set-FTPConnection -Credentials $credentials -Server $ftpServer -Session $ftpServer -UsePassive 
    $Session = Get-FTPConnection -Session $ftpServer
    
    Set-FTPConnection -Credentials $credentials -Server $ftpServer -UsePassive -UseBinary 
    Get-FTPChildItem -path $FtpPath | Get-FTPItem -localpath $FullPath -Verbose
    Get-FTPChildItem -Session $Session -Path $FtpPath -Filter $File | Where {$_.Dir -ne "d" -and $_.Name -ne "/Report/31/"} 


    • Изменено Kalaputsa 13 июня 2013 г. 4:51
    13 июня 2013 г. 4:50
  • 1) А где команда Remove-FTPItem -Session $ftpServer?

    2) Зачем повторно инициализировать сессию Set-FTPConnection -Credentials $credentials -Server $ftpServer -UsePassive -UseBinary ?

    3) В имени папки слэшев быть не должно

    4) Get-FTPChildItem -Session $Session -Path $FtpPath -Filter $File | Where {$_.Dir -ne "d"}

    5) Вывод команды  Get-FTPChildItem -Session $Session -Path $FtpPath -Filter $File | Where {$_.Dir -ne "d"}

    13 июня 2013 г. 5:12
    Отвечающий
  • Файлы удаляет, но тянется к папка и из-а этого выскакивает ошибка и скрипт останавливает работу :(
    ->Remove File: ftp://ftpserver.org/Report/31/TEST.zip
    250 DELE command successful.
    
    ->Remove Dir: ftp://ftpserver.org/Report/31
    Remove-FTPItem : Исключение при вызове "GetResponse" с "0" аргументами: "Удаленный сервер возвратил ошибку: (550) Файл недоступен (например, не найден или к нему нет доступа)."
    D:\script\powershell\REPORTS.ps1:28 знак:1
    + Remove-FTPItem -Session $ftpServer -Path $FtpPath -Recurse
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
        + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Remove-FTPItem

    13 июня 2013 г. 7:36
  • Полный код, структуру папок и что должно получится в итоге.

    13 июня 2013 г. 7:51
    Отвечающий
  • # Создание папки дня в формате ггггддмм (вчерашним днём)
    
    $reportFolder = "D:\script\test"
    $year = get-date -format yyyy
    $month = get-date -format MM
    $folder = $reportFolder + "\" + $year + "\" + $month
    $date = (Get-Date).AddDays(-1).ToString("yyyyMMdd") 
    
    md ("$reportFolder\$year\$month\" + $date)
    
    $FullPath = "$reportFolder\$year\$month\$date"
    
    # Соединение с FTP, скачивание и удаление файлов которые были скачены 
    
    $ftpServer = "ftp://ftpserver.org"
    $username = "Login"
    $password = ConvertTo-SecureString 'Password' -Force -AsPlainText
    $FtpPath = "/Report/31/"
    $File = "*.zip"
    $credentials = New-Object System.Management.Automation.PSCredential($username, $password)
    Set-FTPConnection -Credentials $credentials -Server ftp://ftpserver.org -Session $ftpServer -UsePassive 
    
    $Session = Get-FTPConnection -Session $ftpServer
    
    
    Get-FTPChildItem -path $FtpPath | Get-FTPItem -localpath $FullPath -Verbose
    Get-FTPChildItem -Session $Session -Path $FtpPath -Filter $File | Where {$_.Dir -ne "d"} 
    Remove-FTPItem -Session $ftpServer -Path $FtpPath -Recurse  
    
    # Разархивация архива по маске *.zip
    
    $ZipFilesPath = "$FullPath".
    $UnzipPath = "$FullPath"
    
     
    $Shell = New-Object -com Shell.Application
    $Location = $Shell.NameSpace($UnzipPath)
     
    $ZipFiles = Get-Childitem $ZipFilesPath -Recurse -Include *.ZIP
     
    $progress = 1
    foreach ($ZipFile in $ZipFiles) {
        Write-Progress -Activity "Unzipping to $($UnzipPath)" -PercentComplete (($progress / ($ZipFiles.Count + 1)) * 100) -CurrentOperation $ZipFile.FullName -Status "File $($Progress) of $($ZipFiles.Count)"
        $ZipFolder = $Shell.NameSpace($ZipFile.fullname)
     
     
        $Location.Copyhere($ZipFolder.items(), 1040) 
        $progress++
    }
    
    # Удаление архивированных файлов *.zip
    
    Remove-Item $FullPath -include *.zip -Verbose
    

    13 июня 2013 г. 8:02
  • Одна команда,а не две.

    Get-FTPChildItem -Session $Session -Path $FtpPath -Filter $File -Recurse | Where {$_.Dir -ne "d"} |  Remove-FTPItem -Session $ftpServer

    13 июня 2013 г. 8:18
    Отвечающий
  • В одной команде не удаляет, сразу переходит к разархивации :(
    13 июня 2013 г. 8:45
  • Протестировал, все отрабатывает, как надо.

    $ftpServer = "ftp://ftpserver.org"
    $username = "Login"
    $password = ConvertTo-SecureString 'Password' -Force -AsPlainText
    $FtpPath = "/Report/31/"
    $File = "*.zip"
    $credentials = New-Object System.Management.Automation.PSCredential($username, $password)
    Set-FTPConnection -Credentials $credentials -Server ftp://ftpserver.org -Session ftpServerS -UsePassive 
    
    $Session = Get-FTPConnection -Session ftpServerS
    
    
    Get-FTPChildItem -path $FtpPath | Get-FTPItem -localpath $FullPath -Verbose
    Get-FTPChildItem -Session $Session -Path $FtpPath -Recurse | Where {$_.Dir -ne "dir" -and $_.Name -like "$File*"} | Remove-FTPItem -Session $Session  
    

    Результат:

    PS > Get-FTPChildItem -Session $Session -Path $FtpPath -Recurse | Where {$_.dir -ne "dir" -and $_.
    Name -like "$file*"}
    
    
       Parent: ftp://10.0.0.1/Report/31
    
    Dir Right     Ln  User   Group  Size   ModifiedDate        Name
    --- -----     --  ----   -----  ----   ------------        ----
    -                               0B     06-13-13  01:51AM   1.zip
    -                               0B     06-13-13  01:51AM   3.zip
    
    
       Parent: ftp://10.0.0.1/Report/31/123
    
    Dir Right     Ln  User   Group  Size   ModifiedDate        Name
    --- -----     --  ----   -----  ----   ------------        ----
    -                               0B     06-13-13  02:19AM   d.zip
    
    
    PS > Get-FTPChildItem -Session $Session -Path $FtpPath -Recurse | Where {$_.Dir -ne "dir" -and $_.
    Name -like "$File*"} | Remove-FTPItem -Session $Session
    ->Remove File: ftp://10.0.0.1/Report/31/1.zip
    250 DELE command successful.
    
    ->Remove File: ftp://10.0.0.1/Report/31/3.zip
    250 DELE command successful.
    
    ->Remove File: ftp://10.0.0.1/Report/31/123/d.zip
    250 DELE command successful.
    
    PS > Get-FTPChildItem -Session $Session -Path $FtpPath -Recurse | Where {$_.dir -ne "dir" -and $_.
    Name -like "$file*"}
    PS > Get-FTPChildItem -Session $Session -Path $FtpPath -Recurse
    
    
       Parent: ftp://10.0.0.1/Report/31
    
    Dir Right     Ln  User   Group  Size   ModifiedDate        Name
    --- -----     --  ----   -----  ----   ------------        ----
    DIR                                    06-13-13  02:25AM   123

    • Помечено в качестве ответа Kalaputsa 13 июня 2013 г. 10:14
    13 июня 2013 г. 9:33
    Отвечающий
  • Подскажите, пожалуйста, что не так, и как исправить?

    (С какого-то перепугу вот это вот: "Path is directory", затем после имени файла тычется слэш, и ещё раз имя файла.)

    PS > Get-FTPChildItem -Session $SF -Path $remotepath | Where {$_.Dir -ne "d" -and $_.ModifiedDate -le $oldftp} | Remove-FTPItem -Session $SF -Verbose
    ПОДРОБНО: Выполнение операции "Remove item from ftp location" над целевым объектом "ftp://u109665.your-backup.de/Test/1C20151116.zip".
    ПОДРОБНО: Use original path: ftp://u109665.your-backup.de/Test/1C20151116.zip
    ПОДРОБНО: Remove additonal slash: ftp://u109665.your-backup.de/Test/1C20151116.zip
    ПОДРОБНО: Path is directory
    ПОДРОБНО: Use WebRequestMethods: LIST
    ПОДРОБНО: Use original path: ftp://u109665.your-backup.de/Test/1C20151116.zip/1C20151116.zip
    ПОДРОБНО: Remove additonal slash: ftp://u109665.your-backup.de/Test/1C20151116.zip/1C20151116.zip
    ПОДРОБНО: Path is directory
    ПОДРОБНО: Use WebRequestMethods: LIST
    Get-FTPChildItem : Исключение при вызове "GetResponse" с "0" аргументами: "Удаленный сервер возвратил ошибку: (550) Файл недоступен (например, не найден или к нему нет доступа)."
    F:\scripts\Modules\PSFTP\Remove-FTPItem.ps1:106 знак:17
    +                 $SubItems = Get-FTPChildItem -Path $RequestUri -Session $Session
    +                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
        + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Get-FTPChildItem


    18 ноября 2015 г. 9:06
  • Точно $_.Dir -ne "d" , а не $_.Dir -ne "dir" ?
    18 ноября 2015 г. 9:49
    Отвечающий
  • Точно. Вот пример вывода с "d":

    PS> Get-FTPChildItem -Session $SF -Path "/" | Format-Table
    
    ModifiedDate              SizeInByte                Parent                    Size                      Group                     Dir                       OrgModifiedDate           Ln                        Name                     Right                   
    ------------              ----------                ------                    ----                      -----                     ---                       ---------------           --                        ----                     -----                   
    16.11.2015 14:12:00       6                         ftp://u109665.your-bac...                           u109665                   d                         Nov 16 14:12              2                         1ass                     rwxr-xr-x               
    17.11.2015 22:48:00       10                        ftp://u109665.your-bac...                           u109665                   d                         Nov 17 22:48              2                         Med                      rwxr-xr-x               
    18.11.2015 7:46:00        5                         ftp://u109665.your-bac...                           u109665                   d                         Nov 18 07:46              2                         Test                     rwxr-xr-x               
    02.11.2015 8:32:00        8814559608                ftp://u109665.your-bac... 8GB                       u109665                   -                         Nov  2 08:32              1                         02.11.2015.zip           rw-r--r--               
    04.11.2015 8:43:00        8846866026                ftp://u109665.your-bac... 8GB                       u109665                   -                         Nov  4 08:43              1                         04.11.2015.zip           rw-r--r--               
    05.11.2015 7:12:00        8849727148                ftp://u109665.your-bac... 8GB                       u109665                   -                         Nov  5 07:12              1                         05.11.2015.zip           rw-r--r--               
    06.11.2015 7:49:00        8879042006                ftp://u109665.your-bac... 8GB                       u109665                   -                         Nov  6 07:49              1                         06.11.2015.zip           rw-r--r--               
    

    18 ноября 2015 г. 10:41
  • А если так?

    $CurrentSession = $SF
    Get-FTPChildItem -Session $SF -Path $remotepath | Where {$_.Dir -ne "d" -and $_.ModifiedDate -le $oldftp} | Foreach {
    	$RequestUri = $_.FullName
    	Write-Host $RequestUri -Fore Yellow
    	[System.Net.FtpWebRequest]$Request = [System.Net.WebRequest]::Create($RequestUri)
    	$Request.Credentials = $CurrentSession.Credentials
    	$Request.EnableSsl = $CurrentSession.EnableSsl
    	$Request.KeepAlive = $CurrentSession.KeepAlive
    	$Request.UseBinary = $CurrentSession.UseBinary
    	$Request.UsePassive = $CurrentSession.UsePassive
    	[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$CurrentSession.ignoreCert}
    	$Response = $Request.GetResponse()
    	$Status = $Response.StatusDescription
    	$Response.Close()
    	$Status
    }

    18 ноября 2015 г. 11:59
    Отвечающий
  • Не вполне понимая, что собственно делает этот код (в каком месте удаляется файл с фтп я так и не понял), вставил в текущую сессию. Результат вот:

    PS> $CurrentSession = $SF
    Get-FTPChildItem -Session $SF -Path $remotepath | Where {$_.Dir -ne "d" -and $_.ModifiedDate -le $oldftp} | Foreach {
    	$RequestUri = $_.FullName
    	Write-Host $RequestUri -Fore Yellow
    	[System.Net.FtpWebRequest]$Request = [System.Net.WebRequest]::Create($RequestUri)
    	$Request.Credentials = $CurrentSession.Credentials
    	$Request.EnableSsl = $CurrentSession.EnableSsl
    	$Request.KeepAlive = $CurrentSession.KeepAlive
    	$Request.UseBinary = $CurrentSession.UseBinary
    	$Request.UsePassive = $CurrentSession.UsePassive
    	[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$CurrentSession.ignoreCert}
    	$Response = $Request.GetResponse()
    	$Status = $Response.StatusDescription
    	$Response.Close()
    	$Status
    }
    
    ftp://u109665.your-backup.de/Test/1C20151116.zip
    Foreach : Исключение при вызове "Close" с "0" аргументами: "Удаленный сервер возвратил ошибку: (451) Локальная ошибка при обработке."
    строка:2 знак:109
    + ... -le $oldftp} | Foreach {
    +                    ~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [ForEach-Object], MethodInvocationException
        + FullyQualifiedErrorId : WebException,Microsoft.PowerShell.Commands.ForEachObjectCommand
     
    

    18 ноября 2015 г. 12:45
  • Да, строчку забыл.

    Добавьте, после UsePassive:

    $Request.Method = [System.Net.WebRequestMethods+FTP]::DeleteFile

    18 ноября 2015 г. 12:52
    Отвечающий
  • Так работает. Непонятно почему не работает Remove-FTPItem.

    При чем он не работает даже в весьма явном виде:

    PS> Get-FTPChildItem -Session $SF -Path /Test | Format-Table
    
    ModifiedDate              SizeInByte                Parent                    Size                      Group                     Dir                       OrgModifiedDate           Ln                        Name                     Right                   
    ------------              ----------                ------                    ----                      -----                     ---                       ---------------           --                        ----                     -----                   
    17.11.2015 10:41:00       10341841                  ftp://u109665.your-bac... 10MB                      u109665                   -                         Nov 17 10:41              1                         1C20151117.zip           rw-r--r--               
    18.11.2015 8:08:00        10341841                  ftp://u109665.your-bac... 10MB                      u109665                   -                         Nov 18 08:08              1                         1C20151118.zip           rw-r--r--               
    
    
    
    PS> Remove-FTPItem -Session $SF -Path /Test/1C20151117.zip -Verbose
    ПОДРОБНО: Выполнение операции "Remove item from ftp location" над целевым объектом "ftp://u109665.your-backup.de/Test/1C20151117.zip".
    ПОДРОБНО: Use original path: ftp://u109665.your-backup.de/Test/1C20151117.zip
    ПОДРОБНО: Remove additonal slash: ftp://u109665.your-backup.de/Test/1C20151117.zip
    ПОДРОБНО: Path is directory
    ПОДРОБНО: Use WebRequestMethods: LIST
    ПОДРОБНО: Use original path: ftp://u109665.your-backup.de/Test/1C20151117.zip/1C20151117.zip
    ПОДРОБНО: Remove additonal slash: ftp://u109665.your-backup.de/Test/1C20151117.zip/1C20151117.zip
    ПОДРОБНО: Path is directory
    ПОДРОБНО: Use WebRequestMethods: LIST
    Get-FTPChildItem : Исключение при вызове "GetResponse" с "0" аргументами: "Удаленный сервер возвратил ошибку: (550) Файл недоступен (например, не найден или к нему нет доступа)."
    F:\scripts\Modules\PSFTP\Remove-FTPItem.ps1:106 знак:17
    +                 $SubItems = Get-FTPChildItem -Path $RequestUri -Session $Session
    +                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
        + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Get-FTPChildItem
    

    18 ноября 2015 г. 13:03
  • Проблема с функцией Remove-FTPItem в которой есть функция Get-FTPItemSize.

    if((Get-FTPItemSize -Path $RequestUri -Silent) -ge 0) - Скорее всего тут проблема, почему она возвращает некорректный результат, тут надо тестировать различные  ftp сервера.

    18 ноября 2015 г. 13:14
    Отвечающий
  • В любом случае - спасибо!

    Если знаете - есть ли модули, реализующие SFTP-клиент? С наскоку нагуглить не удалось.


    18 ноября 2015 г. 13:18
  • Есть библиотека от замечательного проекта WinSCP - https://winscp.net/eng/docs/library_powershell и wrapper для нее - http://dotps1.github.io/WinSCP/
    18 ноября 2015 г. 13:21
    Отвечающий
  • Remove-FTPItem dont work for me:

    import-module PSFTP
    $credentials = get-credential
    $server = 'ftp://ftp.mojserwer.nazwa.pl'
    Set-FTPConnection -Credentials $credentials -Server $server -UsePassive -Session backupFTP
    $session = Get-FTPConnection -Session backupFTP
    
    #working
    New-FTPItem -Name 'backup' -Session $session
    #working
    Get-FTPChildItem -Path '\.' -Session $session -Recurse 
    
    #problem
    Remove-FTPItem -Path '\backup' -Recurse -Session $session 

    any idea why?
    30 августа 2021 г. 12:30