这个脚本工作正常,但我发现用户并不总是遵守正确的命名约定,才能有效。 我一直在试图修改它,但我微薄的脚本技能并不能让我find解决办法。
$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个字符)他们可以select将描述放在该作业号之后,以便文件可以看起来像喜欢:
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)}
我现在需要find一种方法来过滤get-childitems,所以它只处理对象与我的文件模式。
你见过正则expression式吗? 模式匹配的面具。
^ 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 }
将允许数字之间的任何其他字符,例如下划线。
你不必循环3次来做replace和重命名。 下面的代码没有考虑到你的用户数据的每一个迭代,但它是一个开始。
$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" }