2014-02-26 8 views
2

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 
} 

답변

1

Session.RemoveFiles을 포함하여 WinSCP .NET 어셈블리의 일부 방법은 단순 경로가 아닌 파일 마스크를 허용합니다.

대괄호는 file mask에서 특별한 의미가 있습니다.

어셈블리 경로로 전달하기 전에 항상 파일 경로에 RemotePath.EscapeFileMask method을 사용해야합니다.

+0

입니다. 고맙습니다. 나는 완전히 업데이트 된 코드를 게시 하겠지만, 주된 변화는 다음과 같다 : $ removalResult = $ session.RemoveFiles ($ session.EscapeFileMask ("/ latest/[b] test")) – user3354235

0

내가 명령 줄에서 이스케이프 시퀀스를 사용하십시오 :

Remove-Item 'C:\Scripts\Test`[1`].txt' 

또는 -LiteralPath 매개 변수를 사용하십시오.

Remove-Item -LiteralPath C:\scripts\test[1].txt 

-LiteralPath 매개 변수는 문자열을 변환하지 않습니다.

+1

답변 해 주셔서 감사합니다. 그러나 문제의 디렉토리가 ftp 서버에 존재하며 FTP 서버에 대한 유일한 액세스 권한은 ftp입니다. winscp [사용 중입니다. .net 라이브러리]를 클릭하여 디렉토리를 제거하십시오. 동일한 컴퓨터에서 PowerShell 스크립트를 실행할 수 없어 삭제할 디렉토리가 있습니다. – user3354235

+0

아아! 나는 그 부분을 놓쳤다. 나는 이것을 재현하려고 노력할 것이다. – ravikanth

+1

감사합니다 - .net 및 powershell에서 액세스 할 수있는 winscp 라이브러리 설치에 대한 지침은 http://winscp.net/eng/docs/library#downloading_and_installing_the_assembly – user3354235