我正在尝试创建一个重命名文件夹中的文件的批处理文件。每个都有相同的命名格式: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 ...
答案 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
和其他情况除外)时,您几乎总是希望将它们放在引号中,以免潜在的空格不会把你扔掉。如果您的变量继承了一个特殊字符,否则该字符需要在单个命令或整个批处理中转义,您需要先解决该问题,然后再在其他地方使用该变量。
参考:For,Parameters / Arguments,Quotes, 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
中文件名的第二部分将为空,因此我们可以忽略它们。否则,我们尝试将其他允许的字符替换为不允许的字符。我选择了""
(空字符串-只需放下字符),_
,$
,x
,q
,j
(因为它们是罕见)或随机数。 changedthisname
跟踪文件是否已重命名,以便该过程不会尝试对同一文件进行多次重命名。
processed
会计算任何通过中具有多余字符的文件名,因此在通过结束时,如果找不到文件名,我们就结束了。
因此,使用car error file (1).txt
作为()[space]
分隔符的%%p
之类的文件名可能会在第一遍car$error file (1).txt
,{{1 }}放在第三位,car$error_file (1).txt
放在第四位。
好吧-将名称更改部分有点复杂,可以说服它是car$error_filej1).txt
+一个随机数-但是,嘿,计算机很复杂,简单的随机数会是-好吧,一点也不有趣。