web-dev-qa-db-ja.com

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

環境: 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つのフォルダを返します。よろしくお願いします。

2
mael'

次のような単純なものを使用できます。

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

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

ECHO %prev%

Screenshot

ここで、knownfile環境変数は、引用符なしのフルパスです。このソリューションで遅延拡張を有効にしたり、CD環境変数をいじったりする必要はありません。

for /Rを使用すると、ディレクトリツリーをたどりますが、for /Fは単に文字列を処理し、それを\文字で分割します。

tokens=1は、文字列の最初の部分を使用するように指示します。その後、フォルダを使用したい場合は、tokens=1,2,3を使用してからset prev=.\%%G\%%H\%%Iを使用することができます。

ドライブ文字を取得したい場合は、.\を使用する代わりに、set prev=%%~dG\%%~Gを使用できます。

参考文献:

0
Worthwelle