重命名文件列表

时间:2015-06-03 09:25:20

标签: powershell

我需要将名为pwd的{​​{1}}下面的所有文件重命名为all_v4_0.csv。 到目前为止,我已经开始使用这个PowerShell:

all_v4_1.csv

但是$oldfiles = dir -recurse | ?{$_.Name -eq "all_v4_0.csv"} foreach ($o in $oldfiles) { $o.CopyTo Join-Path $o.Directory.ToString() "all_v4_1.csv" } 循环失败并显示消息

foreach

我在这里做错了什么?

更新,20150604

如下面由Manuel Batsching评论的那样,可以通过添加两层括号来修复原始版本:一个用于表示函数参数,另一个用于强制求值顺序:

At line:2 char:15
+     $o.CopyTo Join-Path $o.Directory.ToString() "all_v4_1.csv"
+               ~~~~~~~~~
Unexpected token 'Join-Path' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

对于手头的问题,$oldfiles = dir -recurse | ?{$_.Name -eq "all_v4_0.csv"} foreach ($o in $oldfiles) { $o.CopyTo((Join-Path $o.Directory.ToString() "all_v4_1.csv")) } 的其中一个解决方案可能会更容易。

4 个答案:

答案 0 :(得分:1)

在执行复制之前单独设置目标名称。以下应该有效:

$oldfiles = dir -recurse | ?{$_.Name -eq "all_v4_0.csv"}

foreach ($o in $oldfiles) {
    $newName = $o.FullName.replace("all_v4_0.csv","all_v4_1.csv")
    Copy-Item $o.FullName $newName
}

答案 1 :(得分:1)

PSH的解析器没有读取Join-Path及其参数作为表达式来评估并将结果传递给外部表达式。所以用括号来强制评估顺序。

但另外CopyTo是.NET成员,而不是PSH cmdlet,因此需要在其参数周围加上括号(并且没有空格)。

因此:

$o.CopyTo((Join-Path $o.Directory.ToString() "all_v4_1.csv"))

(可能使用PSH' Copy-Item cmdlet将是一个更清晰的选择。)

答案 2 :(得分:1)

如果您想保持简单,您还可以使用字符串连接来创建目标路径。

Get-ChildItem -Recurse -Include 'all_v4_0.csv' | 
    ForEach { $_.MoveTo($_.Directory.FullName + '\all_v4_1.csv') }

答案 3 :(得分:1)

只需替换文件新名称中的子字符串:

Get-ChildItem -Recurse -Include 'all_v4_0.csv' |
  Rename-Item -NewName { $_.Name.Replace('4_0', '4_1') }