2017-05-31 36 views
0

我有一個編譯源映射的腳本,但唯一可以這樣做的方法是複製映射(.vmf)文件並將其命名爲mapCompiler_copy 。我需要這樣做,因爲用於編譯映射的程序在識別映射文件時必須具有特定的名稱。批處理:指定最初指定爲通配符的文件的變量名稱

比方說,我只有一個文件夾內一個.vmf文件,可以說,它是:

C:\CompilerScript\myMap.vmf 

我將如何使用批處理腳本指定名爲「MYMAP」一個變量不最初知道地圖文件的名稱?(因爲不同的人會以不同的方式命名他們的地圖)。

set mapfolder=%1 
set mapname=mapCompiler_copy.vmf 
set mapname_bsp=mapCompiler_copy 
copy /B %1\*.vmf %1\%mapname% 
set map="%mapfolder%\%mapname%" 

這是腳本是如何工作的,現在,在您拖動和文件夾拖放到腳本,該腳本使得地圖文件,並將其命名爲mapCompiler_copy.vmf的副本,這是我在後來的使用程序,例如:

call vbsp.exe -notjunc -leaktest -game "C:\Program Files (x86)\Steam\steamapps\common\Counter-Strike Source\cstrike" %map% 

編輯:更具體,我會拖累和文件夾拖放到腳本,此文件夾的內容僅是地圖文件(.vmf)。我希望腳本能夠存儲地圖的名稱,唯一的信息是擴展名爲(.vmf),並且文件夾內只有一個地圖文件。這是因爲不同的人編譯多個地圖將有不同的地圖文件名稱

回答

0

我會做以下幾點:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_FEXT=.vmf" 
set "_NEXT=.bsp" 

rem // Check (path) argument whether it exists: 
if not exist "%~1" (>&2 echo ERROR: file not found!) & exit /B 1 
rem // Check for directory or for file type (extension): 
set "ATTR=%~a1" 
if "%ATTR:~,1%"=="d" (
    rem // Argument is a directory, so get first matching file: 
    set "FILE=" & set "NAME=" 
    for %%F in ("%~1\*%_FEXT%") do if not defined FILE (
     set "FILE=%%~fF" & set "NAME=%%~nxF" 
     set "FNEW=%%~dpnF%_NEXT%" & set "NNEW=%%~nF%_NEXT%" 
    ) 
) else if /I "%~x1"=="%_FEXT%" (
    rem // Argument is a file, so check its type (extension): 
    set "FILE=%~f1" & set "NAME=%~nx1" 
    set "FNEW=%~dpn1%_NEXT%" & set "NNEW=%~n1%_NEXT%" 
) 
rem // Check if a matching file has been found: 
if not defined FILE (>&2 echo ERROR: file not found!) & exit /B 1 

rem // Return found file: 
echo or. path: "%FILE%" 
echo or. name: "%NAME%" 
echo new path: "%FNEW%" 
echo new name: "%NNEW%" 

endlocal 
exit /B 

因此,如果一個文件被拖入和拖放到批處理腳本,其擴展名(類型)將根據.vmf進行檢查,如果匹配,則返回其路徑和名稱。 如果將一個目錄拖放到批處理腳本中,則會檢查其內容(即時文件子項),並返回帶有.vmf擴展名的第一個找到的文件的路徑和名稱。

+0

這個解決方案效果很好,但是有什麼辦法可以在最後爲我們指定一個帶有.bsp的變量的地圖名?這是爲了在編譯之後,我需要將它複製到cstrike maps文件夾中,並使用該映射啓動遊戲,但只能使用.bsp文件而不是.vmf文件來執行此操作。 –

+0

看我的編輯 - 你的意思是? – aschipfl

+0

雖然這確實有效,但每當我使用%FILE%編譯程序時,它都會指向其他內容。我是否需要封裝整個程序並將_endlocal_放在最後? –

0

我認爲以下可能會幫助你。我的假設是,文件擴展名總是長3(和一個週期)

@echo off 
Set fullpath=C:\CompilerScript\myMap.vmf 
For %%A in ("%fullpath%") do (
    Set Name=%%~nxA 
) 
echo %Name:~0,-4% 
+0

'設置「名稱= %%〜nA」'沒有任何先決條件。 – JosefZ

+0

如果我不知道文件的名稱,這個工作是否可行,但我確實知道擴展名。例如,如果地圖是rp_downtown_complex。 vmf,我需要指定嗎? –

+0

建議的答案應該提取任何長度的文件名,只要文件擴展名是3個字符長。你可以測試這個並自己確認。 – Shankar

相關問題