批次處理:將頂級資料夾名稱設定為變數

批次處理:將頂級資料夾名稱設定為變數

環境:Windows 10
問題:如果可能 - 我們如何將驅動器上最頂層資料夾的名稱設定為變數?

我們從第三方收到一張光碟,其中包含我們使用的系統的更新 - 光碟上有一個帶有當前版本標題(例如blahblahSystemblah-2018October-finalblah)的資料夾,並且包含該版本中的所有資料。將光碟放入系統後,我們使用 robocopy 將變更更新至伺服器,然後執行系統的使用者將由伺服器更新。我們目前的問題是我們必須手動設定資料夾名稱,因為robocopy 不能(據我所知)在其來源中使用通配符,資料夾名稱在其他地方很重要,因此我們不能簡單地讓他們將內容直接放在在光碟上,理想情況下,我們希望在運行批次檔之前不必移動它(使用當前目錄很容易,但正如我所說:資料夾名稱很重要,我們試圖避免任何手動輸入/工作使用者數量達到最低限度)。

腳本的相關部分如下所示:

@echo off
for (however you can get the top folder name automatically) do (set VRSN=however)

robocopy "D:\VRSN" "C:\local\directory" /e /mir /r:0 /w:0 /log:"C:\log\directory.txt"

我能找到的最接近的東西是這段腳本,其中“knownfile”是始終位於資料夾中的檔案的名稱:

setlocal enabledelayedexpansion

cd /d "D:\"

for /R %%G in (knownfile) do (
    set "var1=%%~dpG"
    set "var1=!var1:%CD%=!"
    if not "!var1!"=="!prev!" (
        if "!var1!"=="\" (echo .\) else echo(!var1:~1,-1!
    )
    set "prev=!var1!"
)

-- 但此腳本不僅會輸出包含該已知檔案的資料夾,還會剪輯資料夾名稱的第一個字元。我將是第一個承認我不完全理解語法或哪裡出了問題的人,所以如果有人可以指出我更好的方向或幫助我改進上面的程式碼僅有的返回該資料夾,我們將不勝感激。

答案1

您可以使用像以下這樣簡單的東西:

@ECHO off
set knownfile=D:\Folder\File.txt

for /F "delims=\ tokens=2" %%G in ("%knownfile%") do (
    set prev=.\%%G
)

ECHO %prev%

螢幕截圖

其中knownfile環境變數是不帶引號的完整路徑。您不需要為此解決方案啟用延遲擴展或弄亂CD環境變數。

使用for /R,您可以遍歷目錄樹,而使用 則for /F只是處理字串並在\字元處將其拆分。

tokens=1告訴它使用字串的第一部分。如果您想在此之後使用任何資料夾,您可以透過使用tokens=1,2,3然後set prev=.\%%G\%%H\%%I

如果您想取得磁碟機號,.\您可以使用而不是使用set prev=%%~dG\%%~G

延伸閱讀:

相關內容