0

我在这里有一个批处理文件:当我按下它时,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 shapefiles 文件,它们的文件名现在是:

  • thisthing_arc.adf
  • thisthing_tic.adf
  • thisthing_shp.shp
  • thatthing_shp.shp

... 等等。

我有 83 个这些不同的对象集,每个对象集大约有 16 个文件。我正在尝试制作一个批处理脚本(是的,它必须是批处理的),它读取文件夹中的所有文件,将其放入文件中,然后读取文件列表并为每个文件创建文件夹,如果你采取删除 _ 之后的所有内容(从转换器程序将 _ 添加到其中)。我的脚本虽然不起作用。第二个 for 循环打开每个文件并读取所有内容并打印出数十万行。我似乎无法弄清楚如何使用批处理对文件名进行字符串定界(我不关心文件中的内容)。

概括:

我有所有属于同一个文件夹的文件集被扔到同一个文件夹中。我正在尝试以编程方式(通过批处理)从文件名(出现在_之前的所有内容)中获取集合的名称,创建该文件夹,然后将文件移动到该文件夹​​中。随着循环的进行,任何也属于该文件夹的文件也会被移到那里。

我是否朝着正确的方向前进?谢谢。

4

1 回答 1

2

你肯定走在一个好的轨道上,但是你既有一些语法错误,也有一些逻辑错误。

在您的第二个 FOR 循环中,您试图解析一个字符串,但您的代码正在执行一个命令,因为您的 IN 子句用单引号引起来。你想要双引号来表示一个字符串。

您的整个逻辑从您的第二个 FOR 循环开始。您要解析的字符串是文件名,不带扩展名。所以你的 IN 子句应该是IN ("%%~na"). 然后在该循​​环之后,您尝试创建名为"%%~na"的文件夹并将文件移动到具有新文件名的文件夹%%b。But%%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
于 2012-07-19T20:22:43.583 回答