를 삭제할 수 없는 디렉토리에 대괄호 안에서 이름을 사용하여 WinSCP 및 PowerShell

StackOverflow https://stackoverflow.com//questions/22032008

  •  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 매개 변수하려고하지 않고 변환할 문자열.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top