批处理:分配最初指向通配符的文件的变量名称

时间:2017-05-31 05:12:38

标签: batch-file cmd wildcard

我有一个编译源映射的脚本,但我能做到这一点的唯一方法是制作地图(.vmf)文件的副本并将其命名为mapCompiler_copy。我需要这样做,因为用于编译地图的程序在识别地图文件时必须具有特定的名称。

假设我在文件夹中只有一个.vmf文件,可以说是:

C:\CompilerScript\myMap.vmf

如何使用批处理脚本分配名称" myMap"到一个变量而不知道mapfile的名字?(因为不同的人会以不同的方式命名他们的地图)。

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),并且文件夹中只有一个地图文件。这是因为编译多个地图的不同人员的地图文件名称会有不同的名称

2 个答案:

答案 0 :(得分:0)

我认为以下内容可能会对您有所帮助。我的假设是文件扩展名总是长度为3(和一个句点)

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

答案 1 :(得分: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扩展名的第一个找到的文件的路径和名称。