从批处理文件中的文件名中提取字符串的第一部分,然后在for循环中移动该文件

时间:2012-07-19 18:19:07

标签: windows file batch-file delimiter

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

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

......等等。

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

要点:

我的文件集都属于同一文件夹中的文件集。我正在尝试逐步(通过批处理)从文件名(在_之前发生的所有内容)获取集的名称,创建该文件夹,然后将文件移动到该文件夹​​中。当循环进展时,任何属于该文件夹的文件也会被移动到那里。

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

1 个答案:

答案 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