新手在这里。我正在尝试将PowerShell脚本编写为:
仅获取所有.pdf文件
重命名它们-文件名很长-超过30个字符 -它们包含2个我需要提取的数字 -示例:
Microsoft Dynamics导航2018年累积更新11(内部版本25480).pdf-> 结果:= 18CU11.pdf
我尝试了许多站点的示例,但似乎无法成功循环。 要么得到一个错误-该路径不存在,要么由于循环以某种方式获取文件路径而无法重命名文件,而我无法重命名
Get-ChildItem "C:\Users\******\Desktop\PowerShell Practice" -Filter *.pdf | #create list of files
ForEach-Object{
$oldname = $_.FullName;
$newname = $_.FullName.Remove(0,17);
#$newname = $_.FullName.Insert(0,"CU")
Rename-Item $oldname $newname;
$oldname;
$newname; #for testing
}
这只是最近的尝试,但是其他任何可行的方法也可以-只要能做到即可。
答案 0 :(得分:3)
查看Rename-Item的帮助。参数 -NewName 仅需要文件的名称,而不是完整路径。
尝试一下:
Get-ChildItem "C:\Users\******\Desktop\PowerShell Practice-Filter" -Filter *.pdf | #create list of files
ForEach-Object{
$oldname = $_.FullName
$newname = $_.Name.Remove(0,17)
Rename-Item -Path $oldname -NewName $newname
$oldname
$newname #for testing
}
答案 1 :(得分:0)
请尝试
Get-ChildItem -Path "C:\Users\******\Desktop\PowerShell Practice-Filter" -Filter *.pdf | Rename-Item -NewName $newname
答案 2 :(得分:0)
尝试以下逻辑:
[string]$rootPathForFiles = Join-Path -Path $env:USERPROFILE -ChildPath 'Desktop\PowerShell Practice'
[string[]]$listOfFilesToRename = Get-ChildItem -Path $rootPathForFiles -Filter '*.PDF' | Select-Object -ExpandProperty FullName
$listOfFilesToRename | ForEach-Object {
#get the filename wihtout the directory
[string]$newName = Split-Path -Path $_ -Leaf
#use regex replace to apply the new format
$newName = $newName -replace '^Cumulative Update (\d+) .*NAV 20(\d+).*$', '$2CU$1.pdf' # Assumes a certain format; if the update doesn't match this expectation the original filename is maintained
#Perform the rename
Write-Verbose "Renaming '$_' to '$newName'" -Verbose #added the verbose switch here so you'll see the output without worrying about the verbose preference
Rename-Item -Path $_ -NewName $newName
}