更改文件名的一部分Powershell

35

我每天早上会生成一些文件:

  • Default_20140227_05.00.29.csv
  • Default_20140226_05.00.29.csv

我想将这些文件重命名为:

  • VOD_20140227_05.00.29.csv
  • VOD_20140226_05.00.29.csv

基本上,我需要用 VOD 来替换 Default

我正在使用 Powershell 1.0。非常感谢您的帮助。

4个回答

58

简化版:

ls *.csv | Rename-Item -NewName {$_.name -replace "Default","VOD"}

7
运作得非常好。但请注意,-replace 命令会将搜索参数值视为正则表达式,因此您必须使用特殊的正则表达式字符来查找和替换某些值,例如 \s 可用于查找和替换空格字符。 - oleksa
在Mac上(并且很可能在Linux上也是一样的),我不得不使用gci而不是ls,这很可能是因为ls是一个本地命令。 - Robert Kaucher

23

我没有 PowerShell 1.0 进行测试,但假设您正在运行此文件夹中的文件,您可以尝试:

Get-ChildItem Default_*.csv  |Rename-Item -NewName {$_.name -replace '^Default','VOD'}

7

gci | ?{$_.Name -like "Default*"} | % {$newname = ([String]$_).Replace("Default","VOD"); Rename-item $_ $newname}

更易理解的版本:

查找文件名以“Default”开头的文件,在文件名中将“Default”替换为“VOD”并重命名。

$DefaultFiles =  Get-ChildItem | Where-Object {$_.Name -like "Default*"}
ForEach($File in $DefaultFiles) 
{
    $newname = ([String]$File).Replace("Default","VOD")
    Rename-item -Path $File $newname
}

3
需要解释吗?我感觉发帖者可能没有解析/维护内容的能力。说“它可以用,但我不知道怎么做”并不比完全不知道好多少。 - Travis Griggs
如果你知道命令,它似乎很容易理解,我不应该使用别名或管道。但是,我倾向于在我的回答中投入与提问者相同的努力...无论如何,我已经更新了。 - Cole9350

1
如果您正在寻找一个通用版本,它将接受您的查找和替换作为参数,并记录您重命名的内容(我认为很方便),那么这是一个基于Cole9350的答案构建的版本。
$Find = $args[0]
$Replace = $args[1]
$TargetFiles =  Get-ChildItem | Where-Object {$_.Name -like "*$Find*"}
ForEach($File in $TargetFiles) 
{
    $newname = ([String]$File).Replace($Find,$Replace)
    write-host "Renaming $File to $newname"
    Rename-item -Path $File.PSPath $newname
}

如果你想要递归,只需在 Get-ChildItem 后面加上 -Recurse 即可。


这看起来正是我需要的,但它说“$Find”不被识别为内部或外部命令、可操作程序或批处理文件。我用你的代码创建了一个“test.cmd”文件,在powershell提示符下运行该文件时出现错误,并且当我拖动一个文件夹并将其放在test.cmd文件上(我想要实现的目标)时,它只会短暂地闪现一个cmd窗口,没有重命名发生。 - nollaf126
@nollaf126,这是一个简单的修复方法。此代码使用Powershell编写,因此您需要为文件添加.ps1扩展名,而不是.cmd - 这应该可以解决您的错误。 您还需要提供两个参数,因此如果文件名为rename.ps1,并且您想将Hat重命名为HeadSock,则需要执行rename.ps1 Hat HeadSock - Eris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接