这个脚本运行了一段时间,但我发现用户并不总是遵循正确的命名约定,因此无法使其有效。我一直在绞尽脑汁尝试修改它,但我的脚本编写技能很差,无法找到解决方案。
$directory = 'c:\temp'
Get-ChildItem $directory
Dir $directory | Rename-Item –NewName { $_.name –replace "-"," " }
Dir $directory | Rename-Item –NewName { $_.name –replace "_"," " }
dir $directory |
% {rename-item -path $_.fullname -newname ( ($_.name.split(' ')[0..2] -join '-' ) + $_.Extension )}
用户将要存档的文件放在文件夹中。这些文件应该以作业编号作为文件名的开头,因此它们看起来像:99-99-9999(始终为 10 个字符)。他们可以选择在该作业编号后面添加描述,因此文件可能看起来像:
99-99-9999 - some descrition.txt
描述会有所不同,并且可能包含强制开头后的任何字符。我想使用前 10 个字符重命名文件。我还希望能够确保如果前 10 个字符不是这种格式,脚本就不会运行。
我以为我走在正确的轨道上:$newname = $list.Name.Substring(0,10)
但我无法让它发挥作用。
编辑-我又近了一步。我发现此代码将使用前 10 个字符更改文件名。
gci -Path "c:\temp" | rename-item -newname { [string]($_.name).substring(0,10)}
我现在需要找到一种方法来过滤 get-childitems,以便它只处理具有我的文件模式的对象。
答案1
您无需循环 3 次即可进行替换和重命名。下面的代码并未考虑用户数据的每次迭代,但它是一个开始。
$directory = 'c:\test'
# Get files only
$dirs = Get-ChildItem $directory | where {$_.psiscontainer -eq $false}
#loop through each file name
foreach ($d in $dirs){
$jobNum = $d.Name.Substring(0,10) –replace("_", "-")
$comment = ($d.Name.Substring(10, $d.Name.length - 10))
Rename-Item $d.FullName "$jobNum - $comment"
}
答案2
你见过正则表达式吗?模式匹配掩码。
^ matches from the start of a string
\d matches a digit 0-9
{2} matches something twice
所以:
gci 'c:\temp' |? Name -match '^\d{2}-\d{2}-\d{4}' | ren -N { $_.SubString(0,10)+$_.Extension }
将匹配您想要的模式并重命名它们以删除描述,而忽略其余部分。
或者:
gci 'c:\temp' |? Name -match '^\d{2}.\d{2}.\d{4}' | ren -N {
($_.Name -replace '^(\d\d).(\d\d).(\d\d\d\d).*','$1-$2-$3')+$_.Extension
}
允许数字之间出现任何其他字符,例如下划线。