![将文件夹结构模板复制到当前文件夹](https://linux22.com/image/665461/%E5%B0%86%E6%96%87%E4%BB%B6%E5%A4%B9%E7%BB%93%E6%9E%84%E6%A8%A1%E6%9D%BF%E5%A4%8D%E5%88%B6%E5%88%B0%E5%BD%93%E5%89%8D%E6%96%87%E4%BB%B6%E5%A4%B9.png)
当我们的用户创建新的项目文件夹时,我希望它自动复制模板文件夹结构和模板的权限。到目前为止,我想到的唯一办法是一个批处理脚本,该脚本要求用户输入项目名称,然后调用 robocopy 来复制文件夹模板。这在我的测试中效果很好,但不太方便用户使用。当我实际充实完整的文件夹结构而不是在平面测试文件夹中测试模板和目标时,我也遇到了一个小问题。我正在寻找一种更好的方法来做到这一点,如果这不可能,那么我的 robocopy 脚本的解决方案是处理 {当前文件夹}{选择中命名的文件夹} 目标。
根文件夹是位于具有 Active Directory 身份验证的 Windows 服务器上的网络共享。
这是模板文件夹的位置:\ServerName\Common\Projects_Template
这是创建新项目文件夹的位置:\ServerName\Common\Projects\Region\State{NewProject}
这是我目前按部分分解的 robocopy 脚本。每个 State 文件夹中都保存了一份脚本副本,因此用户只需导航到正确的状态并在其中运行脚本文件即可。第一部分要求用户命名新项目文件夹并将该名称存储在变量中。如果用户输入错误或决定使用其他名称,则简短的错误检查将重新询问该问题。
SET /P fold= Enter the project name:
CHOICE /M "Is this correct: %fold%"
IF %ERRORLEVEL% equ 2 CLS & GOTO start
此部分旨在将模板文件夹复制到当前状态文件夹,但使用在选择部分中输入的名称来命名它。在最初的测试中,我只使用了硬位置,但我不想为每个状态文件夹创建单独的批处理文件。“.\%fold%”部分没有像我希望的那样工作,我怀疑这部分是由于批处理文件是从网络位置运行的。按原样,它会在运行脚本的用户的本地计算机的 C:\Windows\%fold% 位置创建命名文件夹。模板文件夹是隐藏的,这就是为什么 /A-:H 在那里,/XX 是为了防止如果用户意外输入包含数据的现有项目文件夹的确切名称而发生任何损坏,而 /MIR /SEC 和 /SECFIX 是为了从模板文件夹复制确切的权限。
robocopy "\\ServerName\Common\Projects\_Template\\" .\%fold% /MIR /SEC /SECFIX /XX /A-:H >nul 2>nul
理想情况下,如果用户在 State 文件夹中并点击“新建文件夹”,系统会为用户完成所有这些操作,但我不知道如何将其内置到 Windows 文件资源管理器功能中。此外,没有“文件夹结构”的现有标签?
答案1
答案是使用带有参数扩展的命令行参数,将当前驱动器和路径作为 robocopy 目标参数的一部分。该参数是%~dp0
。
以下是摘录http://ss64.com/nt/syntax-args.html这帮助我弄清楚了这一点:
与批处理脚本相关的链接
您可以使用 %0 获取批处理脚本本身的路径名,可以对此应用参数扩展,因此 %~dp0 将返回批处理脚本的驱动器和路径,例如 W:\scripts\ 和 %~f0 将返回完整路径名 W:\scripts\mybatch.cmd
您可以使用以下语法引用与批处理脚本位于同一文件夹中的其他文件:
调用 %0..\SecondBatch.cmd
这甚至可以在子程序中使用,Echo %0 将提供调用标签,但 echo "%~nx0" 将为您提供批处理脚本的文件名。
当 %0 变量扩展时,结果被括在引号中。
在批处理脚本中它看起来像这样:
SET /P fold= Enter the project name:
CHOICE /M "Is this correct: %fold%"
IF %ERRORLEVEL% equ 2 CLS & GOTO start
robocopy "\\ServerName\Common\Projects\_Template\\" "%~dp0\%fold%" /MIR /SEC /SECFIX /XX /A-:H >nul 2>nul
实际上,这句话的意思是:
Robocopy 将 _Template 文件夹复制到当前驱动器\路径,作为以用户在 SET 命令中的输入命名的新文件夹。整个文件夹结构将被镜像以包括数据、属性、时间戳和安全性。防止从目标中删除任何内容(如果文件夹已经存在并且其中包含文件,这应该可以防止 /mir 删除这些文件)。复制文件夹时删除隐藏属性,并通过将错误消息发送到 nul 来防止显示错误消息。
其他注意事项:如果您的源路径或目标路径被双引号包围(以留出空格),则您不能以单引号结束路径,\
因为它被视为转义字符,因此导致尾随"
被视为路径的一部分而不是尾随,"
这当然会导致路径在空格处被分割。解决方案(假设您不能始终确保路径永远不会包含空格)是完全省略尾随\
或将其加倍以使其自行转义(如上面的代码片段所示)。我目前还不清楚最好的做法是什么,因为我一直被告知尾随\
表示文件夹,而省略尾随\
表示文件。