2

不确定 setlocal 的用途,但我在一个脚本示例中找到了它,用于在 for 循环中需要多个命令的其他内容。

Filelist.txt 包含一个文件列表,其中包含共享的完整文件路径。

例如:\\FileShare\Division\Project\file.txt

setlocal enabledelayedexpansion
for /f "delims=" %%i in (filelist.txt) do (
mkdir "D:\Archive\%%~dpi"
move "%%i" "D:\Archive\%%i")
endlocal

该脚本获取 filelist.txt 中的文件(逐行)并复制路径的目录结构,然后移动文件。使用上面的示例,它会创建目录 D:\Archive\FileShare\Division\Project\,然后将文件file.txt移动到该目录。

我从我在这里找到的不同任务的现有示例中将其拼凑在一起。有什么清理小窍门吗?

编辑:解决下面遗嘱中的评论。创建该脚本是为了处理由一年多未访问的文件生成的报告。这就是为什么它需要处理文件列表的原因,因为我想保持文件夹结构和所有其他文件完好无损。如果有某种方法可以将它集成到脚本中,那就太棒了!

4

1 回答 1

0

您不需要delayed expansionsetlocalsetlocal将隔离该部分的范围,以便对变量所做的任何更改都与该范围隔离。只有在循环或 if 语句中扩展变量时才需要延迟扩展。您的脚本没有太多需要真正清理的内容。如果它可以毫无问题地完成您的任务并且效率很高,那么就没有必要进行更改。

变化和原因

  1. setlocal EnableExtensions 不需要范围隔离,但必须启用扩展才能使用该for /f选项。
  2. %%F而不是%%i因为大写字母更容易与修饰符区分开来。(可读性)
  3. if exist "%%~fA"验证脚本运行时列表中的文件是否仍然存在。
  4. for /f "tokens=1 delims=:" %%D in ("%%~dF") do因为文件夹名称不能包含冒号。这将从驱动器的文件路径中删除冒号字符。
  5. &&仅当目标已成功创建时才尝试移动文件。

代码:

rem Hide the Command Output.
@echo off
rem Isolate Variable Scope and Enable Extensions.
setlocal EnableExtensions
rem Loop through the file list and verify file existence.
for /f "delims=" %%F in (filelist.txt) do if exist "%%~fF" (
    rem Parse the drive letter since colon : is not a valid folder character.
    for /f "tokens=1 delims=:" %%D in ("%%~dF") do (
        rem Create the folder hierarchy
        mkdir "D:\Archive\%%~D\%%~pF" && move "%%~fF" "D:\Archive\%%~D\%%~pF"
    )
)
endlocal
于 2013-01-10T20:34:40.387 回答