【问题标题】:Batch Rename Double Letter Folder Problems批量重命名双字母文件夹问题
【发布时间】:2021-03-06 06:48:05
【问题描述】:

好的,所以我非常接近做我需要做的事情了。

我的重命名命令和文件夹末尾的双字母出现问题。出于隐私考虑,代码中的文件夹名称已更改,空间已保留以显示文件夹的命名方式。 双字母是大写的I(眼睛),这个不能改。
是的,此文件存在。

示例:
FolderII - 错误:系统找不到指定的路径。
文件夹 - 作品
FolderI - 作品

for /r "C:\Folder Name" %%a in (*) do if "%%~nxa"=="FileFound" set p=%%~dpnxa
for /f "usebackq tokens=1* delims=." %%A in ("%p%") do set Build=%%B
for /f "tokens=2 delims==" %%G in ('wmic os get localdatetime /value') do set datetime=%%G
for /f "tokens=3 delims=\" %%Z in ("%p%") do set filepath=%%Z
set year=%datetime:~0,4%
set month=%datetime:~4,2%
set day=%datetime:~6,2%

set dbname=Logdb%year%.%Build%

REN "C:\Folder Name\%filepath%\%dbname%" "Logdb%month%-%day%-%year%.%Build%"

输出

已编辑! CMD>REN "C:\文件夹名称\FolderII\Logdb2020.ext" "Logdb11-23-2020.ext" 系统找不到指定的文件。
已添加 CMD>REN "C:\文件夹名称\文件夹\Logdb2020.ext" "Logdb11-23-2020.ext" 这行得通

编辑澄清* 我将解释我希望它如何工作,只要它被分配到的文件夹中没有 II,它就会这样做。

第一行:在此特定文件夹中搜索名为“SYSCON”的文件,无扩展名,一旦找到,将第二行的文件路径分配给 p
第二行: 打开在第一行找到的文件并获取文件中列出的文件的扩展名并将其分配给 Build
第 3 行:获取当前日期以分配给新文件名在 REN
第 4 行:使用在第 1 行中找到的文件路径获取 REN
5-7 设置日期变量的文件夹名称
第 8 行:将新文件名分配给变量
第 9 行:将找到的位置处的旧文件重命名为生成的新文件名

我不是批处理开发人员,我确实按照它们为我工作的方式编写了这些行,但我总是愿意学习如何做得更好,我是一名 PHP 程序员。这是一个不同的项目。
文件夹结构对于应用程序来说是流动的。搜索初始文件的原因是在 4 个文件夹中的 1 个中找到该文件,然后获取该实际文件夹名称。
我可以回显所有变量并查看正确的文件路径、正确的文件名和正确的新文件名。
当使用 II 重命名文件夹中的文件时,它无法找到要重命名的实际文件,这就是我被卡住的地方。
输出的 IMAGE 在逐行时回显,为了隐私起见,我必须更改文件名。这是 CMD 输出,希望能更好地理解

【问题讨论】:

  • 您需要对所涉及的文件/目录的实际名称更加坦诚。遗憾的是,发布的代码只会将p 设置为与“name=FileFound”匹配的最后一个完整文件名,如果您报告的yearbuild 如图所示,dbname 将设置为Logdb2020.ext。因此,生成的rename 命令将是REN "C:\Folder Name\FolderII\Logdb2020.ext" "Logdb11-23-2020.ext",而不是您报告的那样。
  • @Magoo,你是对的。我已经进行了更新并简要说明了我如何看待脚本的工作方式。我的问题是文件夹名称 FolderII 不工作,但文件夹在 REN 部分工作。

标签: batch-file rename file-rename


【解决方案1】:

分配给build 的数据似乎包含尾随空格,可能还有一些不可见的字符。简单的方法是将1* 更改为1,2

由于 Space 是默认分隔符,%%B 将被分配在该行的第一个和第二个空格之间的值。如果您想在扩展程序中使用空格,这很难,但您真的想使用带空格的扩展程序吗?

语法SET "var=value"(其中值可能为空;在这种情况下var 变为未定义)用于确保分配的值中不包含任何杂散的尾随空格。 p>

【讨论】:

    【解决方案2】:

    我不肯定,基于您缺乏具体信息,但作为一个最佳猜测,我认为这样的事情应该执行任务,我认为您的示例正在努力实现。

    @Echo Off
    SetLocal EnableExtensions DisableDelayedExpansion
    For /F "Tokens=1-3 Delims=/ " %%G In (
        '""%__AppDir__%Robocopy.exe" \: . /NJH /L | "%__AppDir__%find.exe" " 123""'
    ) Do Set "YYYY=%%G" & Set "MM=%%H" & Set "DD=%%I"
    
    For /D %%G In (C:\Folder Name\*) Do For %%H In ("%%G\SYSCON"
    ) Do If "%%~aH" Lss "d" If "%%~aH" GEq "-" (
        For /F "UseBackQ Tokens=1,* Delims=." %%I In ("%%H") Do Set "Build=%%J"
        SetLocal EnableDelayedExpansion
        Ren "%%G\Logdb%YYYY%.!Build!" "Logdb%MM%-%DD%-%YYYY%.!Build!"
        EndLocal)
    

    上面的示例要求您用于Build 变量的字符串位于目标文件的最后一个非空行,(带有 CRLF 行结尾的 ASCII 文本)。如果它是该目标文件中唯一的非空行,那么以下内容可能会更有用:

    @Echo Off
    SetLocal EnableExtensions DisableDelayedExpansion
    For /F "Tokens=1-3 Delims=/ " %%G In (
        '""%__AppDir__%Robocopy.exe" \: . /NJH /L | "%__AppDir__%find.exe" " 123""'
    ) Do Set "YYYY=%%G" & Set "MM=%%H" & Set "DD=%%I"
    
    For /D %%G In (C:\Folder Name\*) Do For %%H In ("%%G\SYSCON"
    ) Do If "%%~aH" Lss "d" If "%%~aH" GEq "-" (
        For /F "UseBackQ Tokens=1,* Delims=." %%I In ("%%H"
        ) Do Ren "%%G\Logdb%YYYY%.%%J" "Logdb%MM%-%DD%-%YYYY%.%%J")
    

    【讨论】:

      猜你喜欢
      • 2014-02-06
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 2015-12-03
      • 2012-05-04
      • 1970-01-01
      相关资源
      最近更新 更多