Powershell 如何从文件名中删除最后X个字符

Powershell 如何从文件名中删除最后X个字符,powershell,cmdlet,Powershell,Cmdlet,正在寻找有关编写脚本的帮助,该脚本将从文件名末尾删除特定数量的字符。在我的特殊困境中,我有几十个以下格式的文件: 1234567 xkjdfa.pdf 5413874 KJDFSXZ.pdf 。。。等等等等 我需要删除最后7个字母字符,以保留7位数字作为文件名。通过另一个发布的问题,我能够找到一个脚本,该脚本将从文件名的开头删除第一个X位数,但我很难修改它以从结尾删除: get childitem*.pdf |重命名item-newname{[string]($\ux.name).substri

正在寻找有关编写脚本的帮助,该脚本将从文件名末尾删除特定数量的字符。在我的特殊困境中,我有几十个以下格式的文件:

1234567 xkjdfa.pdf

5413874 KJDFSXZ.pdf

。。。等等等等

我需要删除最后7个字母字符,以保留7位数字作为文件名。通过另一个发布的问题,我能够找到一个脚本,该脚本将从文件名的开头删除第一个X位数,但我很难修改它以从结尾删除:

get childitem*.pdf |重命名item-newname{[string]($\ux.name).substring(x)}

我们将非常感谢任何和所有相关的帮助


恕我直言,

您可以为此编写一个快速bash函数

function fileNameShortener() {
    mv "$1" ${1:0:4}
}
这将采用第一个论点。它存储在$1中,并创建从索引0到索引左侧4个字符的子字符串。然后在move命令中使用该命令将初始文件移动到新文件名。进一步概括:

function fileNameShortener2() {
    mv "$1" ${1:$2:$3}
}
这可以用来作为第二个和第三个函数参数给出起始点和子字符串的长度

fileNameShortener fileName.txt 0 -5 

此示例将从文件名中删除最后5个字符。

编辑:编辑以保留扩展名

还有另一个substring()方法,它使用2个参数startIndex和length

因此,要从basename右侧总共删除8个字符,包括空格:

get-childitem *.pdf | rename-item -newname { $_.basename.substring(0, 
  $_.basename.length-8) + $_.extension } -whatif

What if: Performing the operation "Rename File" on target 
"Item:        /Users/js/1234567890.pdf 
 Destination: /Users/js/12.pdf".
备选方案:使用字符串拆分联接:将名称不带扩展名>7个符号的所有文件重命名为前7个符号(不考虑是否为数字),保留扩展名。 这是一种愚蠢的算法,因为子字符串更快。这有助于使用
[x..y]

请注意,在
Where对象{$\ BaseName.length-gt 7}
中使用
[x..y]
之前,我们先检查字符串长度>7。否则,当名称小于7个符号时,我们将出现cat命中错误,并尝试获取第7个符号


备选方案:使用子字符串。将名称不带扩展名>7个符号的所有文件重命名为前7个符号(不考虑是否为数字),保留扩展名


.Substring(0,7)
#0-第一个符号的位置,7-要取多少个符号。请注意,在使用
中的子字符串之前,我们先检查字符串长度>7,其中对象{$\ BaseName.length-gt 7}
。否则,当名称小于7个符号时,我们会出现cat命中错误

如果当前名称都是
Stuff保留getridof this.pdf
,则您可以简单地使用
.BaseName.Split(“”)[0]
获取空格前的零件。任务不正确。我需要去掉最后7个字母才能留下7个数字。如果有9个字母和7个数字呢?但这是powershell。
get-childitem *.pdf | rename-item -newname { $_.basename.substring(0, 
  $_.basename.length-8) + $_.extension } -whatif

What if: Performing the operation "Rename File" on target 
"Item:        /Users/js/1234567890.pdf 
 Destination: /Users/js/12.pdf".
$RootFolder = '\\server.domain.local\share\folder'
Get-ChildItem -LiteralPath $RootFolder -Filter '*.pdf' | 
    Where-Object { $_.psIsContainer -eq $false } | # No folders
    ForEach-Object { 
        if ($_.Name -match '^(?<BeginningDigits>\d{7})\s.+\.pdf$' ) {
            $local:newName = "$($Matches['BeginningDigits'])$($_.Extension)"
            return Rename-Item -LiteralPath $_.FullName -NewName $local:newName -PassThru
            }    
        } |
    ForEach-Object {Write-Host "New name: $($_.Name)"}
$RootFolder = '\\server.domain.local\share\folder'
@( Get-ChildItem -LiteralPath $RootFolder -Filter '*.pdf' ) | 
    Where-Object { $_.psIsContainer -eq $false } | # No folders
    Where-Object { $_.BaseName.Length -gt 7 } | # For files where basename (name without extension) have more than 7 symbols)
    ForEach-Object { 
            $local:newName =  [string]::Join('', $_.BaseName.ToCharArray()[0..6] ) 
            return Rename-Item -LiteralPath $_.FullName -NewName $local:newName -PassThru
        } |
    ForEach-Object {Write-Host "New name: $($_.Name)"}
$RootFolder = '\\server.domain.local\share\folder'
@( Get-ChildItem -LiteralPath $RootFolder -Filter '*.pdf' ) | 
    Where-Object { $_.psIsContainer -eq $false }
    Where-Object { $_.BaseName.Length -gt 7 } | # For files where basename (name without extension) have more than 7 symbols)
    ForEach-Object { 
            $local:newName = $x[0].BaseName.Substring(0,7)
            return Rename-Item -LiteralPath $_.FullName -NewName $local:newName -PassThru
        } |
    ForEach-Object {Write-Host "New name: $($_.Name)"}