FTP 서버에서 빈 디렉터리를 자동으로 삭제하는 PowerShell 스크립트를 작성하려고합니다. 디렉토리가있는 서버에 직접 액세스 할 수 없습니다. FTP를 통해서만 액세스 할 수 있습니다. 따라서 빈 디렉터리를 삭제하려고 시도 할 때 WinSCP .NET 어셈블리를 사용하는 PowerShell 스크립트를 작성했습니다. 그러나 서버의 많은 디렉토리에는 디렉토리 이름에 대괄호가 있습니다.WinSCP 및 PowerShell을 사용하여 대괄호로 이름이 지정된 디렉터리를 삭제할 수 없습니다.
는 예를 들어, 디렉토리 이름이 호출 될 수 있습니다 [a]153432
은 따라서 삭제하는 스크립트를 작성하는 내 욕망이 디렉토리가 많이 있습니다. 이는 숫자를 사용하여 필요한 디렉토리를 작성하는 프로그램에 의해 작성 되었기 때문에 발생합니다.
PS C:\Users\dbuddrige\Documents\dps> .\delete-squarebracket-dir.ps1
Removal of remote file /latest/[b]test succeeded
:
# program to test deletion of directories with square-brackets in the name.
$HOSTNAME="myftpservername"
$USERNAME="myftpusername"
$PASSWORD="myftppassword"
$DLL_LOCATION="C:\Program Files (x86)\WinSCP\WinSCPnet.dll"
$LOCAL_DIRECTORY="C:\testdir\extended\baseroot"
# Load WinSCP .NET assembly
[Reflection.Assembly]::LoadFrom($DLL_LOCATION) | Out-Null
# Session.FileTransferred event handler
try
{
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.Protocol = [WinSCP.Protocol]::ftp
$sessionOptions.HostName = $HOSTNAME
$sessionOptions.UserName = $USERNAME
$sessionOptions.Password = $PASSWORD
$session = New-Object WinSCP.Session
try
{
# Connect
$session.Open($sessionOptions)
$remoteFileWithUnixPath = "/latest/[b]test"
$removalResult = $session.RemoveFiles($remoteFileWithUnixPath)
if ($removalResult.IsSuccess)
{
Write-Host ("Removal of remote file {0} succeeded" -f $remoteFileWithUnixPath)
}
else
{
Write-Host ("Removal of remote file {0} failed" -f $remoteFileWithUnixPath)
}
}
finally
{
# Disconnect, clean up
$session.Dispose()
}
exit 0
}
catch [Exception]
{
Write-Host $_.Exception.Message
exit 1
}
나는 그것을 실행, 그것은 다음과 같은 메시지를 표시합니다 :이 프로그램을 작동하기 위해, 나는
/latest/[b]test
내 프로그램이 이렇게 가고 빈 디렉토리를 생성
그러나 디렉터리는 삭제되지 않습니다.
나는 또한 같은 구분 기호와 디렉토리 이름을 지정 시도:
$remoteFileWithUnixPath = "/latest/\[b\]test"
을하지만이 또한 실패 (그러나 적어도 그렇게 말한다) : 난을 변경하는 경우,
PS C:\Users\dbuddrige\Documents\dps> .\delete-squarebracket-dir.ps1
Removal of remote file /latest/\[b\]test failed
하지만 디렉토리 이름 [및 변수 $remoteFileWithUnixPath
]은 다음과 같은 형식으로 표현됩니다.
/latest/foo
그런 다음 프로그램을 다시 실행하면 /latest/foo
디렉토리가 삭제됩니다.
누구나 내가이 일을하기 위해해야 할 아이디어가 있습니까?
이 질문에 대한 대답은 마틴 Prikryl에 의해 지적되었다 [! 감사합니다]
는 완벽하게 작동 코드는 다음과 같습니다
이# program to test deletion of directories with square-brackets in the name.
$HOSTNAME="myftpservername"
$USERNAME="myftpusername"
$PASSWORD="myftppassword"
$DLL_LOCATION="C:\Program Files (x86)\WinSCP\WinSCPnet.dll"
$LOCAL_DIRECTORY="C:\testdir\extended\baseroot"
# Load WinSCP .NET assembly
[Reflection.Assembly]::LoadFrom($DLL_LOCATION) | Out-Null
# Session.FileTransferred event handler
try
{
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.Protocol = [WinSCP.Protocol]::ftp
$sessionOptions.HostName = $HOSTNAME
$sessionOptions.UserName = $USERNAME
$sessionOptions.Password = $PASSWORD
$session = New-Object WinSCP.Session
try
{
# Connect
$session.Open($sessionOptions)
$remoteFileWithUnixPath = "/latest/[b]test"
$removalResult =
$session.RemoveFiles($session.EscapeFileMask($remoteFileWithUnixPath))
if ($removalResult.IsSuccess)
{
Write-Host ("Removal of remote file {0} succeeded" -f $remoteFileWithUnixPath)
}
else
{
Write-Host ("Removal of remote file {0} failed" -f $remoteFileWithUnixPath)
}
}
finally
{
# Disconnect, clean up
$session.Dispose()
}
exit 0
}
catch [Exception]
{
Write-Host $_.Exception.Message
exit 1
}
입니다. 고맙습니다. 나는 완전히 업데이트 된 코드를 게시 하겠지만, 주된 변화는 다음과 같다 : $ removalResult = $ session.RemoveFiles ($ session.EscapeFileMask ("/ latest/[b] test")) – user3354235