
환경:윈도우 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