2017-05-31 3 views
0

J'ai un script qui compile les mappages source, mais la seule façon de le faire est de faire une copie du fichier map (.vmf) et de le nommer mapCompiler_copy . Je dois faire ceci puisque les programmes utilisés pour compiler des cartes doivent avoir un nom spécifique en identifiant le fichier de carte.Batch: Affectation du nom de variable du fichier pointé à l'origine en tant que caractère générique

Disons que je n'ai qu'un seul fichier .vmf à l'intérieur d'un dossier, permet de dire qu'il est:

C:\CompilerScript\myMap.vmf 

Comment puis-je utiliser un script batch pour attribuer le nom « myMap » à une variable sans origine savoir le nom du mapfile? (puisque différentes personnes auraient leurs cartes nommées différemment).

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

Voici comment le script fonctionne maintenant, dans lequel vous glissez-déposez un dossier sur le script et le script fait une copie du fichier de la carte et le nomme mapCompiler_copy.vmf, que je l'utilise plus tard dans la programme, par exemple:

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

Edit: pour être plus précis, je vais glisser-déposer un dossier dans le script, et le seul contenu de ce dossier est le fichier de la carte (.vmf). Je veux que le script puisse stocker le nom de la carte avec la seule information étant que l'extension est (.vmf), et il y a seulement un fichier de carte dans le dossier. En effet, différentes personnes qui compilent plusieurs cartes auront des noms différents pour leurs fichiers de carte

Répondre

0

je faire ce qui suit:

@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 

Donc, si un fichier est traîné et laissée tomber sur le script batch, son extension (type) est vérifiée par rapport à .vmf, et si elle correspond, son chemin et son nom sont renvoyés. Si un répertoire est glissé-déposé sur le script de traitement par lots, son contenu (fichiers enfants immédiats) est vérifié et le chemin et le nom du premier fichier trouvé avec l'extension .vmf sont renvoyés.

+0

Cette solution fonctionne très bien, mais est-il possible de faire attribuer le même nom de carte à une variable avec .bsp à la fin? C'est pour après la compilation, j'ai besoin de le copier dans le dossier cstrike maps et aussi commencer le jeu avec cette carte, mais ne peut le faire avec le fichier .bsp pas le fichier .vmf? –

+0

Voir mon édition - c'est ce que vous voulez dire? – aschipfl

+0

Bien que cela fonctionne, chaque fois que j'utilise% FILE% pour les programmes de compilation, il pointe vers autre chose. Ai-je besoin d'encapsuler tout le programme et de mettre le _endlocal_ à la fin? –

0

Je pense que ce qui suit pourrait vous aider. Mon hypothèse est que l'extension de fichier est toujours de longueur 3 (et une période)

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

'Set" Name = %% ~ nA "' sans pré-requis. – JosefZ

+0

Cela fonctionnerait si je ne connaissais pas le nom du fichier, mais je connaissais l'extension. Par exemple, si le mapnane était rp_downtown_complex. Vmf, aurais-je besoin de spécifier cela? –

+0

La réponse proposée doit extraire n'importe quel nom de fichier de longueur, à condition que l'extension du fichier ait une longueur de 3 caractères. Vous pouvez le tester et le confirmer pour vous-même. – Shankar