2012-03-29 9 views
0

を含むRecursivly転換路:)PowerShellの - 私はそれは非常に便利かつ強力な見つける原因、私は最近、PowerShellを使用して開始値

だから、これはシナリオです: お客様は、その中にコンマを持っていたフォルダ構造を持っています。 最新のプログラムが追加されているため、カンマのためにこれが失敗します。これは私が持っているものである

...そして、それは動作しますが、私はそれが非効率的だと感じ - 「」 は基本的に、彼らはただ、たとえばでカンマを置き換えたいです。 スクリプトは想定されていることを行いますが、一方のパスが変更されるとすぐに、元のパスが変更されたため、残りのパスは失敗します。 :)あなたがいずれかを持っている場合、私は十分に説明願ってい

$folderpath = "C:\pathcontainingcomma" 
foreach ($i in get-childitem $folderpath -Recurse) { 
    $name = $i.name.replace(","," - ") 
    Rename-Item -Path $i.fullname -NewName $name -Force -Verbose 
} 

は、質問をしてください:)

答えて

1

をあなたはまだ処理する必要があるパスを変更することを避けるために内側から出て名前を変更する必要がありますので、私以下は動作するはず推測:

Get-ChildItem $folderPath -r '*,*' -name | foreach { 
$p = "$folderPath\$_"; rename-item $p ($p -replace ',',' - ') -whatif } 

$folderpath = 'C:\pathcontainingcomma' 
$items = Get-ChildItem -Recurse $folderpath 
[Array]::Reverse($items) 
$items | ForEach-Object { Rename-Item -Path $_ -NewName ($_ -replace ',', '-') -Force -Verbose } 
+0

引数が 'Path'にnullであるため、引数をバインドできません。 ここに何か不足していますか?名前の変更: 'System.Object []'をパラメータで必要な型 'System.String'に変換できません。 'パス'。指定されたmeth odはサポートされていません。 たとえば、$ items.Nameにする必要がありますか? –

+1

申し訳ありませんが、あなたのコードを忠実にコピーしました。私は 'foreach(){}'がPowerShellの慣用的な解決法ではないと考えているので、パイプラインを使って書き直しました。 – Joey

+0

そして、 '$ items'は配列です(実際のループの前に逆になります)。 'ForEach-Object'は' $ _'を介して現在のパイプライン要素へのアクセスを許可します(通常、scriptblocksを含むパイプラインで)。 – Joey

1

はこれを試してみてください出力順序が-Nameであるため、上位レベルのディレクトリの名前を最初に変更することができ、置換は、出力を渡す際にパスのすべての要素を修正するので、パラメタが便利です。

関連する問題