バッチ: トップレベルフォルダ名を変数として設定する

バッチ: トップレベルフォルダ名を変数として設定する

環境:ウィンドウズ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 つ返していただければ幸いです。

答え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

参考文献:

関連情報