2011-08-24 22 views
7

このpowershellコマンドを呼び出してエラーが発生しました。ナットを運転する。ここでPowershellで再帰的に名前を変更するファイル

Prompt> get-childitem -recurse ./ *NYCSCA* | where-object { $_.Name -like 
"*NYCSCA*" } | rename-item $_ -newname $_.Name.Replace(" ","_") -whatif 

は応答です:

You cannot call a method on a null-valued expression. 
At line:1 char:140 
+ get-childitem -recurse ./ *NYCSCA* | where-object { $_.Name -like "*NYCSCA*" } | select FullName | rename-item $_ -n 
ewname $_.Name.Replace <<<< (" ","_") -whatif 
    + CategoryInfo   : InvalidOperation: (Replace:String) [], RuntimeException 
    + FullyQualifiedErrorId : InvokeMethodOnNull 

私は最後の部分を削除した場合、私はファイルのリストを取得します。すべての手がかりは?私はまだ明らかにパワーシェルを貪欲にしていない。

注:これをスーパーユーザーに投稿しようとしましたが、このサイトは一貫して失敗しています。この正確な質問を追加できません。

ここでは大幅に簡略化されています。私はこの古典的な例を働かせることさえできません。

gci *NYCSCA* | ren $_ ($_.Name).Replace("foo","bar") 

ありがとうございました@JNK、ありました。

gci -recurse | where-object{ $_.Name -like "*NYCSCA*"} | %{rename-item $_.FullName $_.FullName.Replace("NYCSCA","SDUSD") } 
+0

参照http://stackoverflow.com/a/21614001/8479 – Rory

答えて

7

私はあなたがforeachのオブジェクトが必要だと思う:

get-childitem -recurse ./ *NYCSCA* | where-object { $_.Name -like 
"*NYCSCA*" } | % {rename-item $_ -newname $_.Name.Replace(" ","_") -whatif} 

パイプで連結された配列は、セットとして名前を変更することはできませんあなたが興味を持っている場合には、私は必要なソリューションは、これです。

+0

いや同じ:ここ –

+0

@ダニエル - 新しい回答を試してください – JNK

+0

はい!それはそうです - ありがとう。私はセット対アイテムをよりよく理解する必要があります。しかしこれは素晴らしいことです! –

5

Get-ChildItem -Filter *NYCSCA* -Recurse | 
Where-Object {!$_.PSIsContainer} | 
Rename-Item -NewName { $_.Name.Replace(' ','_') } -WhatIf 

(改行が明瞭ために追加編集)のみ、ファイル名を変更するための簡易版ですエラー。上記の単純化されたバージョンを追加しました。

+1

実際の違いは、 'rename-item'引数に' {...} 'というコードブロックを使って' $ _'を参照できるようにすることです(foreach-objectが解決策を提供する理由です) – Richard

+0

True、foreach-オブジェクトは仕事をしますが、オーバーヘッドを追加します(遅くなります)。 –

+0

興味深いので、rename-itemは、foreachの一連の操作でrename-itemsを呼び出すのではなく、その引数をセットとして扱います。 –

関連する問題