从文件名中删除无关的字符

时间:2017-04-02 01:18:41

标签: powershell

我的任务是在我的头上稍微拿走文件库并从文件名中删除多余的垃圾字符并将重命名的文件保存在不同的目录文件夹中。

文件名的一个例子是:

100-expresstoll.pdf
1000-2012-09-29.jpg
10000-2014-01-15_14.03.22.jpg
10001-2014-01-15_19.05.24.jpg
10002-2014-01-15_21.30.23.jpg
10003-2014-01-16_07.33.54.jpg
10004-2014-01-16_13.33.21.jpg
10005-Feb 4, 2014.jpeg
10006-O'Reilly_Media,_Inc..pdf

开头的第一组数字是记录ID,并与文件的扩展名一起保留。记录ID和文件扩展名之间的所有其他内容都需要删除。

例如,前三个文件的最终名称为:

100.pdf
1000.jpg
10000.jpg

除了其他帖子之外,我还阅读了Removing charactersRearranging filenames,但前面有一个可变字符长度的复杂性,要​​删除的可变数量的中间字符和可变文件扩展名类型除了我有限的PowerShell覆盖范围之外,我真的把它扔了。

4 个答案:

答案 0 :(得分:3)

另一种没有正则表达式的方法。在以下两个示例中,使用风险缓解参数float horiAxis = CrossPlatformInputManager.GetAxis("Horizontal"); if (horiAxis > 0){ MoveRight(horiAxis); } public void MoveLeft(float val) { theRB.velocity = new Vector2(-moveSpeed * val, theRB.velocity.y); } 进行调试。

重命名文件:

-WhatIf

重命名和移动文件:

Get-ChildItem -File | ForEach-Object {
    $oldFile = $_.FullName
    $newName = $_.BaseName.Split('-')[0] + $_.Extension
    if ($_.Name -ne $newName) {
        Rename-Item -Path $oldFile -NewName $newName -WhatIf
    }
}

答案 1 :(得分:2)

您可以使用-replace运算符执行此类字符串操作:

Get-ChildItem | foreach {

    $old_name = $_.FullName
    $new_name = $_.Name -replace '([0-9]+).*(\.[^.]*)$', '$1$2'

    Rename-Item $old_name $new_name
}

正则表达式就是这里的诀窍:

  1. ([0-9]+)表示匹配一系列数字(1位或更多位数)
  2. .*表示匹配任何内容
  3. (\.[^.]*)表示匹配句点
  4. 以外的任何字符
  5. $表示匹配必须到达字符串的末尾
  6. 第一个和第三个是特殊的,因为它们被括号括起来,这意味着您可以在替换字符串中使用美元符号(例如$1)来使用这些值。

答案 2 :(得分:2)

解决这个问题的最惯用的方法可能如下(假设所有感兴趣的文件 - 而不是其他文件 - 都在当前目录中。):

Get-ChildItem -File | Rename-Item -NewName { ($_.BaseName -split '-')[0] + $_.Extension }

将常用参数-WhatIf添加到Rename-Item命令,以预览重命名操作。

请注意Rename-Item始终重命名当前位置的项目;要(也)移动它们,请使用Move-Item

如果已存在具有相同名称的目标,Rename-Item会报告每个此类情况的非终止错误(不会中止整体处理)。
请注意,如果输入文件名不包含-,也会发生这种情况,因为这会导致尝试将文件重命名为自身。

<强>解释

  • Get-ChildItem -File输出表示当前目录中文件的[System.IO.FileInfo]个对象,这些对象通过管道(|)传递给Rename-Item

  • 将脚本块({ ... })传递给Rename-Item的{​​{1}}参数会执行每个输入对象的包含代码,其中-NewName表示手头的输入对象。

    • 请注意,这种几乎未记录但经常使用的技术称为脚本块参数[value],其中用于获取管道输入的参数可以与间接处理输入的脚本块绑定。
  • $_从每个输入文件名的基本名称(没有扩展名的文件名)中提取第一个($_.BaseName -split '-')[0] - 分隔的标记。

  • -,因为LHS是一个字符串,执行 string 连接。

  • +从每个输入文件名中提取文件扩展名。

答案 3 :(得分:0)

我知道这不是PowerShell的事情。如果你只是想要一些工作,这是一个cmd批处理文件。

SETLOCAL ENABLEDELAYEDEXPANSION

SET "OLDDIR=C:\Users\lit\files"
SET "NEWDIR=C:\Users\lit\newdir"

FOR /F "usebackq tokens=*" %%a IN (`DIR /A:-D /B "%OLDDIR%\*"`) DO (
    FOR /F "usebackq delims=- tokens=1" %%b IN (`ECHO %%a`) DO (SET "BN=%%b")
    SET "EXT=%%~xa"
    ECHO COPY /Y "%OLDDIR%\%%~a" "%NEWDIR%\!BN!!EXT!"
)