Directory

將文件夾結構模板複製到目前文件夾

  • September 28, 2015

當我們的使用者創建一個新的項目文件夾時,我希望它自動複製模板文件夾結構和模板的權限。到目前為止,我唯一想到的是一個批處理腳本,它要求使用者輸入項目名稱,然後呼叫 robocopy 來複製文件夾模板。這在我的測試中執行良好,但不是非常使用者友好。當我實際充實完整的文件夾結構而不是在平面測試文件夾中測試模板和目標時,我也遇到了一個小問題。我正在尋找一種更好的方法來做到這一點,如果這不可能,那麼我的 robocopy 腳本的解決方案可以處理 {current folder}{folder named in choice} 目的地。

根文件夾是位於具有 Active Directory 身份驗證的 Windows 伺服器上的網路共享。

這是模板文件夾的位置:\ServerName\Common\Projects_Template

這是創建新項目文件夾的位置:\ServerName\Common\Projects\Region\State{NewProject}

這是到目前為止我按部分細分的 robocopy 腳本。腳本的副本保存在每個狀態文件夾中,因此使用者只需導航到正確的狀態並在其中執行腳本文件。第一部分要求使用者命名新項目文件夾並將該名稱儲存在變數中。如果使用者輸入錯誤或決定使用不同的名稱,則簡短的錯誤檢查將重新詢問問題。

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 文件資源管理器功能中。此外,“文件夾結構”沒有現有標籤嗎?

事實證明,答案是使用帶有參數擴展的命令行參數,將目前驅動器和路徑作為 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 來防止顯示錯誤消息。

其他注意事項:如果您的源或目標路徑用雙引號括起來(以允許空格),那麼您不能以單引號結束路徑,\因為它被視為轉義字元,因此導致尾隨"被視為路徑的一部分,並且不是尾隨",這當然會導致路徑在空間處分裂。解決方案(假設您不能始終確保路徑永遠不會包含空格)是\完全不使用尾隨或將其加倍以使其自身轉義(如上面的程式碼片段所示)。我目前還不清楚最佳實踐是什麼,因為我一直被告知尾隨\表示文件夾,而離開尾隨\表示文件。

引用自:https://serverfault.com/questions/716682