【问题标题】:Recursively renaming files in Powershell在 Powershell 中递归重命名文件
【发布时间】:2011-11-03 03:40:08
【问题描述】:

调用此 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

如果我删除最后一部分,我会得到一个文件列表。有什么线索吗?很明显,我还没有熟悉 powershell。

注意:我试图将其发布给超级用户,但该网站现在一直失败 - 不允许我添加这个确切的问题。

这里大大简化了。我什至无法让这个经典示例起作用。

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

谢谢@JNK,% 做到了。如果您有兴趣,我需要的解决方案是:

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

【问题讨论】:

标签: powershell


【解决方案1】:

我认为你需要 foreach-object:

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

管道数组不能重命名为集合。

【讨论】:

  • 是的!就是这样-谢谢。我需要更好地理解集合与项目。但这很棒!
  • 很高兴它有帮助。每当管道不工作时,我的第一步就是尝试一个 foreach-object。
  • 当 powershell 下拉到一个文件夹中进行重命名时,它会抱怨该文件不存在。我该如何解决这个问题?
  • @TheMuffinMan 我会发布一个关于它的新问题。这可能与您使用的确切语法有关。
  • 此命令似乎不适用于 @TheMuffinMan 报告的子目录。请参阅stackoverflow.com/a/21614001/8479
【解决方案2】:

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

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

编辑:为清楚起见添加了换行符

【讨论】:

  • 这里真正的区别是在rename-item参数中使用代码块{...}来允许引用$_(这就是为什么foreach-object也提供了一个解决方案。
  • 没错,foreach-object 可以完成这项工作,但会增加开销(并且速度较慢)。
  • 有趣,所以这让 rename-item 将其参数视为一个集合,而不是在 foreach 的一组操作中调用 rename-item。
猜你喜欢
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
相关资源
最近更新 更多