我制作了一个Windows bat脚本,用于从列表中归档旧文件。 任何关于代码语法的build议?

不知道setlocal是什么,但我发现它在一个脚本的例子中,需要多个命令在for循环。

Filelist.txt包含文件的完整文件path到共享列表。

例如:\\ 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中的文件(逐行)并复制path的目录结构,然后移动文件。 使用上面的示例,它将创build目录D:\ Archive \ FileShare \ Division \ Project \,然后将文件file.txt移动到该目录。

我从这里find的不同任务的现有例子中将这些结合在一起。 任何提示清理它?

编辑:从下面的意见发表评论。 该脚本的创build是为了消除一年以来没有被访问的文件生成的报告。 这就是为什么它需要处理一个文件列表,因为我想保持文件夹结构和所有其他文件不变。 如果有什么方法可以将这个脚本集成到这个脚本中,那真是太棒了!

你不需要delayed expansionsetlocalsetlocal将隔离该部分的范围,以便对变量所做的任何更改都与该范围保持隔离。 只有在循环内或者语句内扩展变量时才需要延迟扩展。 没有太多的真正清理你的脚本。 如果它没有问题地完成你的任务并且高效地完成任务,则不需要改变。

变化和原因

  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