在Powershell中递归重命名文件

Dan*_*ams 9 powershell

调用此powershell命令并收到错误.使我抓狂.

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

以下是回复:

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
Run Code Online (Sandbox Code Playgroud)

如果我删除最后一部分,我会得到一个文件列表.有线索吗?显然,我还没有讨论过powershell.

注意:我试图将此发布给超级用户,但该网站现在一直都失败了 - 不会让我添加这个确切的问题.

这里大大简化了.我甚至无法得到这个经典的例子.

gci  *NYCSCA*  | ren $_ ($_.Name).Replace("foo","bar")
Run Code Online (Sandbox Code Playgroud)

谢谢@JNK,%做了.我需要的解决方案就是这个,万一你感兴趣:

gci -recurse | where-object{ $_.Name -like "*NYCSCA*"} | %{rename-item $_.FullName $_.FullName.Replace("NYCSCA","SDUSD") }
Run Code Online (Sandbox Code Playgroud)

JNK*_*JNK 8

我认为你需要foreach-object:

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

管道阵列无法重命名为一组.


Sha*_*evy 5

这是一个仅重命名文件的简化版本

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

(编辑:为清晰起见添加了换行符)