批处理脚本从文件名中删除#(仅在特定目录中)

批处理脚本从文件名中删除#(仅在特定目录中)

我正在寻找一个脚本来从特定目录(PDF 文档)中的任何文件名中删除 # 字符。

我一直在看一些类似的例子,但这一切都有点令人困惑!

答案1

@echo off &setlocal
cd /d c:\users\data
for /f "delims=" %%a in ('dir /b /a-d *#*.pdf') do (
    set "fname=%%~a"
    setlocal enabledelayedexpansion
    set "nname=!fname:#=!"
    ren "!fname!" "!nname!"
    endlocal
)

答案2

现在是 2013 年,您应该使用 PowerShell:

Get-ChildItem | Where-Object {$_.Name -match '#'} | ForEach-Object { Rename-Item -Path $_.Name -NewName $($_.Name -Replace "#", "") -WhatIf }

导航到相关目录并执行该行。它会查找所有带有 # 的文件,然后重命名每个文件。删除“-Whatif”以实际执行操作。

使用别名和默认值的较短版本是:

ls | ? {$_.Name -match "#"} | ForEach { rni $_.Name $($_.Name -Replace "#", "")}

至少在我看来,长版本比 1980 年代的批处理语法更易读。这里唯一难以理解的部分是 '$.名称', '$' 在 PowerShell 中指的是循环中的当前对象。这里在所有情况下都指的是当前文件。因为我们需要 -NewName 参数的表达式,所以我们必须将其包装到 $() 中

相关内容