Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 解析和重命名文本文件_Windows_Batch File_Scripting - Fatal编程技术网

Windows 解析和重命名文本文件

Windows 解析和重命名文本文件,windows,batch-file,scripting,Windows,Batch File,Scripting,我需要将所有这些文件重命名为第3行的6个字符的零件号(306391) 目前我有: setlocal enabledelayedexpansion set first=1 for /f "skip=3 delims= " %%a in (Name.txt) do ( if !first! ==1 ( set first=0 echo %%a > out.txt ren Name.txt %%a.txt ) ) 查找6位零件号并将文件重命名为正确的名称。但如果使

我需要将所有这些文件重命名为第3行的6个字符的零件号(306391)

目前我有:

setlocal enabledelayedexpansion 

set first=1

for /f "skip=3 delims= " %%a in (Name.txt) do ( 

   if !first! ==1 (

   set first=0

echo %%a > out.txt
ren Name.txt %%a.txt

 )
)

查找6位零件号并将文件重命名为正确的名称。但如果使用*.txt而不是.txt文件的实际名称,则会中断。我需要它来处理目录中的所有.txt文件。

用另一个
for
循环包围
for/f
循环,然后在
ren
命令中引用外部循环变量。您还可以使用
(如果已定义)
进行布尔检查,从而消除延迟扩展的需要。我在这里和那里做了其他调整。只要问问你是否需要细节

@echo关闭
setlocal
对于(*.txt)中的%%I,请执行以下操作(
先发制人=
对于/f“usebackq skip=3”%%a in(“%%~fI”)do(
如果不首先定义(
先设置=1
echo%%~nxI^>%%a.txt
rem//当您确信它工作正常时,请取消对此的注释
rem//ren“%%~fI”“%%a.txt”
)
)
)

此方法应该运行得更快,特别是当文件较大时,因为每个文件只读取4行(而不是整个文件):

@echo关闭
setlocal EnableDelayedExpansion
rem处理所有.txt文件
对于(*.txt)中的%%f,请执行以下操作(
读第四行
(对于(1,1,4)中的/L%%i,请设置/P“line4=”)<“%%f”
rem重命名该文件
对于(“!line4!”)中的/F%%a,请执行ECHO ren“%%F”“%%a.txt”
)

So基本上对于(*.txt)中的%%I do(对于/f“skip=3 delims=“%%a in”(“%%~fI”)do(如果!first!==1(设置first=0 ren”%%~fI)%%a.txt似乎没有为我做任何文件。几乎没有。进一步检查后,您的脚本需要其他调整。我将我的评论移到了一个答案。顺便说一句,第一个问题非常好!看到新成员实际发布代码而不是说“为我编写脚本。这是我需要它做的。”很高兴你没有这么做。
:)
你能详细介绍一下“%%~fI”的用法吗%%~nxI^>我理解了它背后的逻辑,但不明白它是如何工作的。
%%~fI
意味着将
%%I
扩展到其完全限定的
驱动器:\\path\\to\\filename.txt
。这并不是真的必要,但如果将来决定让脚本递归,事情会变得更容易(将第一个
for
循环更改为
for/R
).The
^>
只意味着将一个文本
字符回显到控制台,而不是像
通常那样将输出重定向到文件。插入符号是一个转义字符。%%nxI有什么用?没关系,我想出来了。它明确指定了
%%i
文件名.ext
。如果您正在运行它递归地,
%%~nxI
将省略打印文件夹名称,而只打印文件名。请参阅控制台窗口中的
帮助的最后几页,以了解有关平铺符号的详细信息。我认为这是需要阅读的第四行。他跳过了3行。
@echo off
setlocal EnableDelayedExpansion

rem Process all .txt files
for %%f in (*.txt) do (

   rem Read the 4th line
   (for /L %%i in (1,1,4) do set /P "line4=") < "%%f"

   rem Rename the file
   for /F %%a in ("!line4!") do ECHO ren "%%f" "%%a.txt"

)