를 삭제할 수 없는 디렉토리에 대괄호 안에서 이름을 사용하여 WinSCP 및 PowerShell
-
21-12-2019 - |
문제
내가 하려고 쓰기 PowerShell 스크립트는 자동으로 삭제하는 빈 디렉토리에 FTP 서버입니다.이 없어요 직접 액세스하는 서버의 디렉토리에 있는-나에만 액세스할 수 있습니다 그들 via FTP.이러한 이유로 작성 PowerShell 스크립트를 사용하는 WinSCP.NET 어셈블리(하려고)삭제 빈 디렉토리입니다.나는 그럼에도 불구하고,문제에서는 많은 디렉토리의 서버에서이 대괄호로 묶 디렉토리에서 이름입니다.
예를 들면,디렉터 이름이라고 불릴 수 있: [a]153432
의 많은 이들 디렉토리에 따라서 내 욕망하는 스크립트를 작성하여 삭제합니다.이 때문에 발생합니다 그들에 의해 만들어 사용하는 프로그램 번호를 만들 수 있는 디렉토리가 필요합니다.에서 작업하기 위해서 이 프로그램을 만들고,빈 디렉토리
/latest/[b]test
내 프로그램은 다음과 같습니다.
# 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
}
을 때 나는 그것을 실행,그것은 다음과 같은 메시지를 표시합니다.
PS C:\Users\dbuddrige\Documents\dps> .\delete-squarebracket-dir.ps1
Removal of remote file /latest/[b]test succeeded
그러나,디렉토리내의 삭제되지 않습니다.
안정 디렉토리의 이름으로 구분 기호와 같은:
$remoteFileWithUnixPath = "/latest/\[b\]test"
그러나 이것도 실패합니다(하지만 적어도 그것은 그렇게 말한다):
PS C:\Users\dbuddrige\Documents\dps> .\delete-squarebracket-dir.ps1
Removal of remote file /latest/\[b\]test failed
하지만,변경하는 경우 디렉토리 name[및 변수 $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
}
해결책
몇 가지 방법의 WinSCP.NET 어셈블리를 포함하여 Session.RemoveFiles
, 을 받아,파일 마스크,간단한 경로에 있습니다.
대괄호해야에서 특별한 의미 파일크.
당신은 항상 사용해야 합니다 RemotePath.EscapeFileMask
방법 에 파일의 경로를 전달하기 전에 그들을 어셈블리는 방법이 있습니다.
다른 팁
내가 사용하여 탈출 시퀀스에서 명령행:
Remove-Item 'C:\Scripts\Test`[1`].txt'
거나 사용 -LiteralPath
매개 변수입니다.
Remove-Item -LiteralPath C:\scripts\test[1].txt
The-LiteralPath 매개 변수하려고하지 않고 변환할 문자열.