WinSCPとPowerShellを使用して、名前に角括弧が付いたディレクトリを削除できません

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

  •  21-12-2019
  •  | 
  •  

質問

FTPサーバー上の空のディレクトリを自動的に削除するPowerShellスクリプトを作成しようとしています。私はディレクトリが存在するサーバーに直接アクセスすることはできません-私はFTP経由でしかアクセスできません。このため、WinSCP.NETアセンブリを使用して空のディレクトリを削除する(しようとする)PowerShellスクリプトを作成しました。しかし、サーバー上のディレクトリの多くには、ディレクトリ名に角括弧が付いているという問題があります。

たとえば、ディレクトリ名は次のように呼ばれます: [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

しかし、ディレクトリ名[と変数を変更すると $remoteFileWithUnixPath]のようなものに

/latest/foo

そして、プログラムを再実行すると、ディレクトリが削除されます /latest/foo いいんだ

誰かが私がこれを動作させるために何をする必要があるかのアイデアを持っていますか?


この質問への答えはMartin 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

-LiteralPathパラメーターは、文字列を変換しようとしません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top