WinSCPとPowerShellを使用して、名前に角括弧が付いたディレクトリを削除できません
-
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パラメーターは、文字列を変換しようとしません。