0

我刚刚开始了一个更大的项目,主要包括分析数据和寻找算法以维护系统的某些功能。

为了开始,我得到了一堆记录的数据,不幸的是,在命名方面并不一致。通常,所有文件(都在一个文件夹中)应该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

但到目前为止它并没有真正起作用,我不知道为什么。

我应该如何进行?

4

2 回答 2

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)中,a%var%在解析时被变量 AT PARSE TIME 的内容替换 - 这适用于从FOR关键字到右括号的整个语句。

有一些简单的方法可以解决这个问题(“延迟扩展”问题 - 很多很多 SO 项目),但在这种情况下,它不是必需的。

首先,PUSHD切换到所需的目录,然后FOR/R抓取所有文件名并依次.CSV应用它们。%%i

ECHO如果找到所需的字符串(=不区分大小写),将设置%%i为0;否则非零。抑制呼应.FIND/iERRORLEVEL>nulFIND

如果为 1 或更大,则格式IF ERRORLEVEL 1为 TRUE ,并且由. 请注意,这在这里不起作用,因为它将被 PARSE-TIME 值替换,因此是不变的。ERRORLEVELERRORLEVELFINDIF %ERRORLEVEL% GEQ 1%errorlevel%ERRORLEVEL

设置renme为 Y(好吧,任何值都可以)确保它为从文件中读取的第一行定义的,该文件的名称很方便,%%irenme随后被清除,因此不再DEFINED因此该REN命令将仅对第一行执行。

我不确定您是否要添加.csv到文件名读取或否。显然,如果不需要,请删除。

于 2013-11-11T14:57:22.357 回答
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) 中的文件名是绝对路径,则重命名命令可能会失败。您将不得不“移动”文件而不是重命名它。

于 2013-11-11T13:19:48.303 回答