我这里有一个批处理文件: 当我按下它时,StackOverflows“代码”窗口没有显示任何内容,所以希望它不会对它进行屠宰:
@echo off
echo Moving files to respective folders.
DIR C:\ArcConverted\adam\shapefiles\ /A:-D /B > C:\ArcConverted\adam\filelist.txt
echo File start > C:\ArcConverted\adam\output.txt
FOR /f %%a IN (C:\ArcConverted\adam\filelist.txt) DO (
FOR /f "tokens=1 delims=_" %%b IN ('%%a') do echo A:%%a B: %%b
IF NOT EXIST C:\ArcConverted\adam\shapefiles\%%~na\ mkdir C:\ArcConverted\adam\shapefiles\%%~na\
echo Moving file %%a into C:\ArcConverted\adam\shapefiles\%%~na\
move C:\ArcConverted\adam\shapefiles\%%a C:\ArcConverted\adam\shapefiles\%%~na\%%b
)
pause
我的C:\ ArcConverted \ adam \ shapefiles文件是新转发的ArcGIS shapefile,现在它们的文件名是:
......等等。
我有83个不同的对象集,每个都有大约16个文件。我正在尝试创建一个批处理脚本(是的,它必须是批处理),它读取文件夹中的所有文件,将其放入文件中,然后读取文件列表,并为每个文件创建文件夹,如果你采取的话超过_的所有内容(_是从转换器程序添加到它)。 我的脚本不起作用。第二个for循环打开每个文件并读取所有内容并打印出数十万行。我似乎无法弄清楚如何使用批处理对文件名进行字符串分隔(我不关心文件中的什么)。
要点:
我的文件集都属于同一文件夹中的文件集。我正在尝试逐步(通过批处理)从文件名(在_之前发生的所有内容)获取集的名称,创建该文件夹,然后将文件移动到该文件夹中。当循环进展时,任何属于该文件夹的文件也会被移动到那里。
我是朝着正确的方向前进吗? 感谢。
答案 0 :(得分:2)
你肯定处于良好的轨道上,但你既有一些语法错误,也有一些逻辑错误。
在你的第二个FOR循环中,你试图解析一个字符串,但你的代码正在执行一个命令,因为你的IN子句用单引号括起来。你想要双引号来表示一个字符串。
你的第二个FOR循环开始你的整个逻辑是关闭的。要解析的字符串是文件的名称,没有扩展名。所以你的IN子句应该是IN ("%%~na")
。然后在该循环之后,您尝试创建名为"%%~na"
的文件夹,并使用新文件名%%b
将文件移动到该文件夹。但%%b
不再定义,因为它不在你的第二个循环中。实际上你想创建一个名为"%%b"
的文件夹,并在第二个循环中将文件全部移动到那里。
最后,您的FOR / F选项存在一些问题。第一个FOR将打破第一个空格角色的名称,这不是你想要的。当然,如果你的文件名中没有空格,那么这不是问题。但为什么要冒这个机会呢?此外,;
的默认EOL选项将忽略以;
开头的任何文件名。再次不太可能,但为什么要冒险。文件名不能包含:
,因此对于EOL来说这是一个很好的角色。
我相信您正在寻找以下代码。
@echo off
echo Moving files to respective folders.
dir C:\ArcConverted\adam\shapefiles\ /A:-D /B > C:\ArcConverted\adam\filelist.txt
echo File start > C:\ArcConverted\adam\output.txt
for /f "eol=: delims=" %%a in (C:\ArcConverted\adam\filelist.txt) do (
for /f "eol=_ tokens=1 delims=_" %%b in ("%%a") do (
echo A:%%a B:%%b
if not exist "C:\ArcConverted\adam\shapefiles\%%b\" mkdir "C:\ArcConverted\adam\shapefiles\%%b\"
echo Moving file "%%a" into "C:\ArcConverted\adam\shapefiles\%%b\"
move "C:\ArcConverted\adam\shapefiles\%%a" "C:\ArcConverted\adam\shapefiles\%%b\"
)
)
pause
但是,我会简化代码。我不认为需要filelist.txt文件 - 您可以使用简单的FOR循环而不是编写文件并使用FOR / F读取它。如果只是将目录(pushd)更改为shapefile根目录,代码也会变得更小更简单。
最后一件事是对您尝试移动的文件设置过滤器。如果文件名不包含"_"
字符,我认为您不想使用整个名称创建文件夹。因此,我的修改后的代码会在名称中明确查找"_"
。
@echo off
setlocal
pushd "C:\ArcConverted\adam\shapefiles" || exit /b
echo Moving files to respective folders.
for %%A in ("*_*.*") do (
for /f "eol=_ tokens=1 delims=_" %%B in ("%%~nA") do (
if not exist "%%B\" mkdir "%%B\"
echo Moving file "%%A" into "%%B\"
move "%%A" "%%B\"
)
)
pause