Из этого списка полей метода веб-запросов я успешно удалил файлы с моего сервера через FTP, в основном заполнив руководство по этой странице с небольшими изменениями:
$url = "ftp://server.net/path/to/place/FILE.txt"
$userName = "username"
$password = "p@ssw0rd!"
$ftpreq = [System.Net.FtpWebRequest]::create($url)
$ftpreq.Credentials = New-Object System.Net.NetworkCredential($userName, $password)
$ftpreq.Method = [System.Net.WebRequestMethods+Ftp]::DeleteFile
$ftpreq.GetResponse()
Файл с именем FILE.txt
, папка с именем FOLDER
.
Когда я пытаюсь сделать что-то подобное, но для папки я получаю ошибки PowerShell и отклик 550.
Я пробовал в основном два варианта метода удаления файла.
Попробуйте 1: изменить URL-адрес в соответствии с именем папки, оставьте метод
Обратите внимание, что папка, которую я пытаюсь удалить, находится рядом с файлом, который я уже успешно удалил.
$url = "ftp://server.net/path/to/place/FOLDER"
$userName = "username"
$password = "p@ssw0rd!"
$ftpreq = [System.Net.FtpWebRequest]::create($url)
$ftpreq.Credentials = New-Object System.Net.NetworkCredential($userName, $password)
$ftpreq.Method = [System.Net.WebRequestMethods+Ftp]::DeleteFile
$ftpreq.GetResponse()
Исключительная ситуация при вызове "GetResponse" с аргументом (ами) "0": "Удаленный сервер возвратил ошибку: (550) Файл недоступен
(например, файл не найден, нет доступа).
Попробуйте 2: изменить метод
$url = "ftp://server.net/path/to/place/FOLDER"
$userName = "username"
$password = "p@ssw0rd!"
$ftpreq = [System.Net.FtpWebRequest]::create($url)
$ftpreq.Credentials = New-Object System.Net.NetworkCredential($userName, $password)
$ftpreq.Method = [System.Net.WebRequestMethods+Ftp]::RemoveDirectory
$ftpreq.GetResponse()
Исключительная ситуация при вызове "GetResponse" с аргументом (ами) "0": "Удаленный сервер возвратил ошибку: (550) Файл недоступен
(например, файл не найден, нет доступа). "
Внедренное решение
function DeleteFtpFolder($url, $credentials)
{
$listRequest = [Net.WebRequest]::Create($url)
$listRequest.Method = [System.Net.WebRequestMethods+FTP]::ListDirectoryDetails
$listRequest.Credentials = $credentials
$lines = New-Object System.Collections.ArrayList
$listResponse = $listRequest.GetResponse()
$listStream = $listResponse.GetResponseStream()
$listReader = New-Object System.IO.StreamReader($listStream)
while (!$listReader.EndOfStream)
{
$line = $listReader.ReadLine()
$lines.Add($line) | Out-Null
}
$listReader.Dispose()
$listStream.Dispose()
$listResponse.Dispose()
foreach ($line in $lines)
{
$tokens = $line.Split(" ", 5, [System.StringSplitOptions]::RemoveEmptyEntries)
$type = $tokens[2]
$name = $tokens[3]
$fileUrl = ($url + "/" + $name)
if ($type -eq "<DIR>")
{
Write-Host "Found folder: $name"
DeleteFtpFolder $fileUrl $credentials
Write-Host "Deleting folder: $name"
$deleteRequest = [Net.WebRequest]::Create($fileUrl)
$deleteRequest.Credentials = $credentials
$deleteRequest.Method = [System.Net.WebRequestMethods+FTP]::RemoveDirectory
$deleteRequest.GetResponse() | Out-Null
}
else
{
$fileUrl = ($url + "/" + $name)
Write-Host "Deleting file: $name"
$deleteRequest = [Net.WebRequest]::Create($fileUrl)
$deleteRequest.Credentials = $credentials
$deleteRequest.Method = [System.Net.WebRequestMethods+FTP]::DeleteFile
$deleteRequest.GetResponse() | Out-Null
}
}
}
$credentials = New-Object System.Net.NetworkCredential($AzureFtpUsername, $AzureFtpPassword)
$url = $AzureFtpUrl
DeleteFtpFolder $url $credentials
Установка представляет собой встроенный сценарий PowerShell внутри шага процесса в Octopus Deploy. Вот почему я вызываю функцию внизу.
Это решение почти идентично принятому ответу с некоторыми незначительными изменениями в том, куда я помещаю рекурсивный вызов и как анализируются возвращаемые данные с сервера. Его решение выглядит так, как будто оно выглядит как вывод ls
с большим количеством столбцов, в то время как мое решение выглядело как вывод dir
с меньшим количеством столбцов. Но даже тогда это не выглядело как вывод dir
на моей локальной машине с Windows, поэтому я не совсем уверен, что именно происходит. Но это работает, так что этого достаточно.