我一直在尝试编写一个脚本来删除文件名的末尾部分,并将其替换为版本号。我试过修剪和分裂,但由于额外的点和正则表达式不好,我有问题。
这些是文件示例:
Filename.Api.sow.0.1.1856.nupkg
something.Customer.Web.0.1.1736.nupkg
我想从这些文件名中删除0.1.18xx
并从变量中添加内部版本号。这可能是1.0.1234.1233
(major.minor.build.revision)
所以最终结果应该是:
Filename.Api.sow.1.0.1234.1233.nupkg
something.Customer.Web.1.0.112.342.nupkg
这是我尝试拆分然后重命名。但它不起作用。
$files = Get-ChildItem -Recurse | where {! $_.PSIsContainer}
foreach ($file in $files)
{
$name,$version = $file.Name.Split('[0-9]',2)
Rename-Item -NewName "$name$version" "$name".$myvariableforbuild
}
答案 0 :(得分:1)
你快到了。这是一个正则表达式的解决方案:
$myVariableForBuild = '1.0.1234.1233'
Get-ChildItem 'c:\your_path' -Recurse |
where {! $_.PSIsContainer} |
Rename-Item -NewName { ($_.BaseName -replace '\d+\.\d+\.\d+$', $myVariableForBuild) + $_.Extension }
答案 1 :(得分:0)
可能不是最简洁的方法,但我会根据“。”拆分字符串,获取数组的最后一个元素(文件扩展名),然后迭代每个数组元素。如果它的非数字将它附加到一个新字符串,如果数字断开循环。然后将新版本和文件扩展名附加到新字符串。
$str = "something.Customer.Web.0.1.1736.nupkg"
$arr = $str.Split(".")
$extension = $arr[$arr.Count - 1]
$filename = ""
$newversion = "1.0.112.342"
for ($i = 0 - 1; $i -lt $arr.Count; $i++)
{
if ($arr[$i] -notmatch "^[\d\.]+$")
{
# item is not numeric - add to string
$filename += $arr[$i] + "."
}
else
{
# item is numeric - end loop
break
}
}
# add the new version
$filename += $newversion + "."
# add the extension
$filename += $extension
显然它不是你问题的完整解决方案,但有足够的东西让你开始。