我需要将名为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
我在这里做错了什么?
如下面由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"))
}
的其中一个解决方案可能会更容易。
答案 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') }