如何重命名文件夹中的所有文件,变量中包含空格

时间:2019-07-11 13:26:19

标签: batch-file

我正在尝试创建一个重命名文件夹中的文件的批处理文件。每个都有相同的命名格式:car error file (1).txt

如何从标题中删除空格?我必须替换每个文件中的所有空格,制表符和类似字符,并用一个欢乐的字符(|)替换它们,以便我可以从每个文件中提取一个字符串。

我的错误是批处理文件试图查找仅具有名称car的文件,显然它不存在。

old名称不需要为之后保存,因此它们都可以称为car1,car2等。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

SET dir=C:\Users\betacom\Desktop\file\pat\SEMPREALAMENTARSEOH\

echo.>Output.csv

for /f %%f in ('dir /b %dir%*.txt') do (
    ::rename %%f "something.txt"
)

for /f %%f in ('dir /b %dir%*.txt') do (
    for /f "delims=" %%a in ('findstr \.edi %dir%%%f') do echo(%%a;;%%f)>>Output.csv

::after this row above will be:
    REM for /f "tokens=2 delims=|" %%a in ('findstr \.edi %dir%%%f') do echo(%%a;;%%f)>>%dir%Output.csv

)

当前文件名:

  

汽车错误文件(1).txt
  汽车错误文件(2).txt   ...

我需要他们是什么:

  

car1.txt
  car2.txt   ...

2 个答案:

答案 0 :(得分:0)

根据要求:

@echo off

set "dir=C:\Users\betacom\Desktop\file\pat\SEMPREALAMENTARSEOH"

setlocal enabledelayedexpansion
for /f %%A in ('dir /b %dir%\*.txt') do (
    rename "%%A" "%%~nA something.txt"
    set "var=%%~nxA"
    for /f "delims=" %%B in ('findstr \.edi %dir%\!var!') do (
        echo(%%B;;%%A)>>Output.csv
        echo(%%B;;%%A)>>%dir%\Output.csv
    )
)

在不完全知道您要完成的工作的情况下,我对for循环进行了重组,以使其更加有意义。例如,当您只更改for命令时,无需使用具有相同do选项的单独循环-因此,我嵌套了循环并添加了多条do行当适用。

我根据个人喜好更改了一些内容,以说明如果您以%%A开头并在引入新参数(%%A,{{1} },%%B等)-这样一来,您就知道%%C是您的第二个/嵌套参数,而无需回头查看任何内容;最好避免在参数中使用小写字母,因为其中一些与参数扩展名相关。

正如我们在注释中所提到的-每当您在命令中处理变量(%%B和其他情况除外)时,您几乎总是希望将它们放在引号中,以免潜在的空格不会把你扔掉。如果您的变量继承了一个特殊字符,否则该字符需要在单个命令或整个批处理中转义,您需要先解决该问题,然后再在其他地方使用该变量。

参考:ForParameters / ArgumentsQuotes, Escape Characters, Delimiters

答案 1 :(得分:0)

@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
:again
SET /a processed=0
FOR /f "delims=" %%a IN ( 'dir /b /a-d "%sourcedir%\*car*" ' ) DO (
 rem for each filename matching mask...
 FOR /f "tokens=1*delims=() " %%p IN ("%%a") DO IF "%%q" neq "" (
  rem here for filenames containing at least 1 of the delimiter set to be eliminated
  rem try to create a new filename containing not-banned characters
  SET /a processed+=1
  SET "changedthisname="
  FOR %%r IN ("" _ $ x q j %random%) DO IF NOT DEFINED changedthisname (
   IF NOT EXIST "%sourcedir%\%%p%%~r%%q" REN "%sourcedir%\%%a" "%%p%%~r%%q"&SET "changedthisname=y"
  )
 )
)
ECHO namechange attempts=%processed%%
IF %processed% gtr 0 GOTO again
GOTO :EOF

您需要根据自己的情况更改sourcedir的设置。清单使用适合我系统的设置。

由于您似乎并不在意新文件名,只要它不包含要删除的字符,也许就可以完成您的任务。

外部循环会查找包含car的任何文件名,并将整个名称分配给%%a

下一个循环将分析名称并将其分为两部分-任何不需要的字符之前和之后的部分(在delims=中设置)。如果文件名没有多余的字符,则%%q中文件名的第二部分将为空,因此我们可以忽略它们。否则,我们尝试将其他允许的字符替换为不允许的字符。我选择了""(空字符串-只需放下字符),_$xqj(因为它们是罕见)或随机数。 changedthisname跟踪文件是否已重命名,以便该过程不会尝试对同一文件进行多次重命名。

processed会计算任何通过中具有多余字符的文件名,因此在通过结束时,如果找不到文件名,我们就结束了。

因此,使用car error file (1).txt作为()[space]分隔符的%%p之类的文件名可能会在第一遍car$error file (1).txt,{{1 }}放在第三位,car$error_file (1).txt放在第四位。

好吧-将名称更改部分有点复杂,可以说服它是car$error_filej1).txt +一个随机数-但是,嘿,计算机很复杂,简单的随机数会是-好吧,一点也不有趣。

相关问题