3

ディレクトリ構造全体のすべてのファイルから、powershell で特殊文字を再帰的に削除できるかどうかを知りたいですか?

たとえば、次のファイルがあるとします。

my presentation (fix).xlsx

名前を次のように変更したいと思います。

my presentation fix.xlsx

ご指導ありがとうございます。

これを行う必要がある理由は、多くのファイルを sharepoint 2010 に移行しており、sharepoint は特殊文字を含むファイルを好まないためです!

4

3 に答える 3

6

私はこのコードをテストしていませんが、おそらく次のようなものが必要だと思います:

Function Rename-Files($path)
{
 Get-ChildItem -path $path | 
 Foreach-Object { 
      $newName = $_.name -replace '[^A-Za-z0-9-_ \.\[\]]', ''
      if (-not ($_.name -eq $newname)){
        Rename-Item -Path $_.fullname -newname ($newName) 
      } 
 }
} #end function

Rename-Files -path "C:\somepath"

効果的には、ディレクトリをループして(関数を再帰的に変更する)、不適切な文字を置き換え(適切なものに正規表現を変更する) 、何も置き換えないでください(効果的に削除します)

于 2013-04-03T21:11:23.883 に答える
2

次のコマンドは、一致するディレクトリ構造を再帰的にトラバースし、一致する各ファイルまたはディレクトリに対して、powershell-replace演算子を使用して問題のある各文字を空の文字に置き換えることにより、そのファイルの名前を変更します。

フィルタリングするすべての正規文字に一致する正規表現を作成する必要があることに注意してください。提供した例と一致させて丸括弧を削除すると、正規表現は次のようになります。

$re = "[()]"

角かっこを追加したい場合は、バックスラッシュを使用してエスケープする必要があります。

$re = "[\[\]()]"

必要に応じて、外側の角括弧の間に文字を追加し続けます。

$re = "[\[\]()!]"

-replaceスクリプトは次のとおりです。オペレーターが各反復で名前の基本部分のみに作用するように、ちょっとしたダンスに注意してください。

dir -Recurse | ?{$_.Name -match $re}  | %{ren -literalpath $_.FullName -newname (join-path (get-item $_.PSPArentPath) $($_.Name -replace $re,""))}

いくつかのメモ:

  • コマンドの-LiteralPath引数は、renファイルを角かっこで置き換えることができるようにするために必要です: [] Powershell v3 IIRC でのみ使用できます。
  • 名前の変更後に名前の競合が発生する可能性がありますが、このスクリプトはそれを処理しません。
于 2013-04-03T22:29:34.723 に答える
1

次のようなことを試してみてください。

gci * | % {$newname = $_.name -replace '\(|\)|{|}'  
           if (-not ($_.name -eq $newname)){
               rename-item $_.name $newname
           }
          }

上記は次のようなファイルを修正します:

私のプレゼンテーション (修正).xlsx

テスト {ddd}.ps1

于 2013-04-03T21:14:24.627 に答える