我刚刚开始了一个更大的项目,主要包括分析数据和查找算法,以维持系统的某个功能。
为了开始,我得到了一堆记录的数据,遗憾的是,在命名方面并不一致。通常,所有文件(都在一个文件夹中)应以SPY.SPYNODE.SIDE
开头,然后继续使用每个值或变量的特定名称。但是,数据记录器搞砸了几次并给出了奇怪的名称,如SP0E1A~1.csv
(所有文件都是.csv文件)。
当我想到而不是手动重命名几千个文件时,我可以“轻松地”使用一个简单的批处理文件来完成名称的工作。而那正是我开始发疯的时候: - )
到目前为止,我想出了以下内容:
FOR /R %%i in (%CD%) DO (
set file1=%%i
if not %file1%=="SPY.SPYNODE.SIDE" DO (
set /p "filename" < %file1%
rename %file1% %filename%
)
)
所以我想要它做的是(伪代码)
look through the whole folder and every file
save the filename in variable file1
if file1 partially equals SPY.SPYNODE.SIDE
open the file and save the first line (which contains the correct name of the file) in variable filename
rename the file with the correct filename
但到目前为止它并没有真正奏效,我不知道为什么。
我该怎么办?
答案 0 :(得分:0)
你没有说出它是什么,也没有正确做到,所以我不得不猜测。
我没有彻底测试脚本(通过创建一个像你所描述的文件系统树),但这种修改似乎很有用:
FOR /R %%i in (*) DO (
IF NOT "%%~nxi"=="SPY.SPYNODE.SIDE" DO (
SET /P filename= < "%%~i"
RENAME "%%~i" "%filename%"
)
)
你没有说为什么将文件名保存在另一个变量中很重要,所以我删除了那部分。
如果你没有给它一个,那么 FOR /R
遍历当前目录,所以我删除了那个部分。 parens中的表达式是一种匹配的模式(但根据我的经验,必须包含一个通配符,否则它会尝试将表达式附加到它找到的每个文件的变量中。)
%%~nxi
只为您提供文件名和扩展名。否则,您将获得该文件的完整路径,并且对于不在CWD中的任何文件,相等性比较将失败。
set /p
表达式在变量名后需要等于(=),变量名不能在引号中。 (不应该使用它们,因为变量名称中不能包含空格或特殊字符。)
如果特殊文件(SPY.SPYNODE.SIDE)中的文件名是绝对路径,则重命名命令可能会失败。你必须“移动”文件而不是重命名它。
答案 1 :(得分:0)
@ECHO OFF
SETLOCAL
PUSHD \sourcedir
FOR /R %%i in (*.csv) DO (
ECHO %%i|FIND /i "spy.spynode.side" >NUL
IF ERRORLEVEL 1 (
SET renme=Y
FOR /f "delims=" %%r IN ('TYPE "%%i"') DO IF DEFINED renme SET "renme="&REN "%%i" "%%r.csv"
)
)
POPD
GOTO :EOF
这应该适合你。
你的问题是在一个复合语句中(比如FOR
)一个%var%
在解析时由变量AT PARSE TIME的内容替换 - 并且来自于FOR
关键字到右括号。
有很简单的解决方法(“延迟扩展”问题 - 许多很多SO项目),但在这种情况下,它不是必需的。
首先,PUSHD
切换到所需的广告,然后FOR/R
抓取所有.CSV
个文件名并依次将它们应用到%%i
。
ECHO
%%i
FIND
为/i
所需的字符串(ERRORLEVEL
=不区分大小写)会将>nul
设置为0(如果找到);否则为非零。 FIND
会抑制回显IF ERRORLEVEL 1
的结果。
如果ERRORLEVEL
为1或更高,则ERRORLEVEL
格式为TRUE,FIND
设置IF %ERRORLEVEL% GEQ 1
。请注意%errorlevel%
在此不起作用,因为ERRORLEVEL
将被renme
的PARSE-TIME值替换,因此是不变的。
将%%i
设置为Y(嗯,任何值都可以)确保为从renme
方便地命名的文件中读取的第一行定义 IS 但是然后DEFINED
被清除,因此不再是REN
因此只会对第一行执行.csv
命令。
我不确定您是否要将{{1}}添加到filename-read或no。显然,如果不需要,请删除。