Batch file 剥离文件名的一部分并将其用于比较
我正在为Windows命令行构建一个脚本,在该脚本中,我尝试检查循环中的一些文件名,然后将部分文件名剥离到一个变量中以供进一步使用。基本上,我想做的是:Batch file 剥离文件名的一部分并将其用于比较,batch-file,batch-processing,Batch File,Batch Processing,我正在为Windows命令行构建一个脚本,在该脚本中,我尝试检查循环中的一些文件名,然后将部分文件名剥离到一个变量中以供进一步使用。基本上,我想做的是: 列出某个目录中的所有文件,在本例中拆分扩展名,如.osm.pbf 将文件名分配给变量 在另一个变量中删除文件名的最后7个字符 将此新变量与“-latest”进行比较 如果比较为true,则剪切包含文件名的变量的一部分 如果比较为false,则将完整变量转换为另一个变量 通过一些尝试和错误以及一些在线搜索,我已经到达了这一点(这仍然不是我想要的)
basse normandie latest.osm.pbf
:
basse-normandie-latest
-latest
-latest
ECHO is on.
第一个回显是正确的,尽管文件名后面有一个空格。(实际上这是“最新的贝斯诺曼底”。)
第二个echo似乎没有考虑这个训练空间,因为它正确地将“-latest”作为最后7个字符。这个回音还有一个尾随空格(所以实际上它是“-最新的”。)
第三个回显是尝试从变量中清除空格(使用“:”),但这会导致另一个尾随空格。(所以实际上它是“最新的”。)
IF语句之后的最后一个echo(我尝试从文件名中剪切“-latest”部分)会导致“echo是开的”
我在脚本顶部声明了SETLOCAL enabledelayedexpansion enableextensions
你有没有想过如何做到这一点,即去掉尾随空格以使比较有效
提前感谢您为我们提供了正确的方向
ECHO !VECTOR_CURRENT_MAP2! >> %VECTOR_LOGFILE%
导致将环境变量VECTOR\u CURRENT\u MAP2
的值附加到文件中,该文件的文件名存储在环境变量VECTOR\u LOGFILE
中,并带有一个尾随空格,因为重定向操作符>
之前有一个空格,该空格由Windows命令处理器解释为通过命令ECHO输出的字符串。必须删除此空格,才能将文件名重定向到日志文件中,而不带尾随空格
一般来说,如果变量字符串以空格结尾,并且数字是有效的句柄号,如1
或2
或3
,则将变量字符串重定向到文件中时,变量字符串和重定向运算符之间没有空格,这一点至关重要。有几种解决方案可以解决这个问题,比如指定重定向到commandECHO,即
>>%VECTOR_LOGFILE% ECHO !VECTOR_CURRENT_MAP2!
但是,在这里使用延迟扩展作为简单的必要条件时,可以安全地在末尾附加重定向,在感叹号和>
之间没有空格,即
ECHO !VECTOR_CURRENT_MAP2!>> %VECTOR_LOGFILE%
Windows command processor会忽略后的空格重定向操作符,因此可以保留该操作符,尽管许多具有良好语法高亮显示的批处理文件程序员(如我)不会在重定向操作符后插入空格
将字符串与命令IF进行比较,并将一个字符串用双引号括起来(这总是一个好主意),必须确保另一个字符串也用双引号括起来。如果在比较字符串之前不删除双引号,则命令。双引号是比较字符串的一部分
状况
IF !LAST_BIT!=="-latest"
仅当分配给环境变量最后一位的字符串带有引号时才为真,这与批处理代码的情况不同,因此该条件永远不为真。
正确答案是:
IF "!LAST_BIT!"=="-latest"
无需使用命令DIR在目录中搜索具有模式的文件,因为命令for正是为完成此任务而设计的。只有在默认情况下启用了命令扩展时,才能处理命令DIR的输出
Microsoft将文件扩展名定义为文件名中最后一个点之后的所有内容。因此,文件的文件扩展名分别为pbf
。pbf
和。osm
属于文件名
FOR命令提供了几个修饰符来获取文件或目录名的特定部分。在命令提示符窗口中运行时,这些修饰符将在控制台窗口的帮助输出中进行解释。命令CALLoutput withCALL/?
的帮助说明了批处理文件或子例程(嵌入批处理文件中的批处理文件)的处理参数
删除所有错误的代码:
FOR %%M IN (*.osm.pbf) DO (
SET "VECTOR_CURRENT_MAP2=%%~nM"
SET "VECTOR_CURRENT_MAP2=!VECTOR_CURRENT_MAP2:~0,-4!"
ECHO !VECTOR_CURRENT_MAP2!>>%VECTOR_LOGFILE%
SET "LAST7CHARS=!VECTOR_CURRENT_MAP2:~-7!"
ECHO !LAST7CHARS!>>%VECTOR_LOGFILE%
IF "!LAST7CHARS!" == "-latest" (
SET "VECTOR_CURRENT_MAP3=!VECTOR_CURRENT_MAP2:~0,-7!"
) ELSE (
SET "VECTOR_CURRENT_MAP3=!VECTOR_CURRENT_MAP2!"
)
ECHO !VECTOR_CURRENT_MAP3!>>%VECTOR_LOGFILE%
)
更简单的方法是将此代码与commandSET的字符串替换功能结合使用,即在字符串中搜索所有出现的字符串,不区分大小写,并将其替换为另一个字符串,该字符串也可以是空字符串
FOR %%M IN (*.osm.pbf) DO (
SET "VECTOR_CURRENT_MAP2=%%~nM"
SET "VECTOR_CURRENT_MAP2=!VECTOR_CURRENT_MAP2:~0,-4!"
ECHO !VECTOR_CURRENT_MAP2!>>%VECTOR_LOGFILE%
SET "VECTOR_CURRENT_MAP3=!VECTOR_CURRENT_MAP2:-latest=!"
ECHO !VECTOR_CURRENT_MAP3!>>%VECTOR_LOGFILE%
)
Windows命令处理器执行时,%%~nM
将被不带驱动器、路径和文件扩展名的文件名替换为basse normandie latest.osm中的示例
不需要的文件名部分.osm
将与两个批处理代码块中的下一行一起删除,这两个批处理代码块将从文件名字符串中删除最后4个字符
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
echo/?
获取/?
如果/?
设置/?
阅读问题的答案,了解我为什么使用set“var
FOR %%M IN (*.osm.pbf) DO (
SET "VECTOR_CURRENT_MAP2=%%~nM"
SET "VECTOR_CURRENT_MAP2=!VECTOR_CURRENT_MAP2:~0,-4!"
ECHO !VECTOR_CURRENT_MAP2!>>%VECTOR_LOGFILE%
SET "VECTOR_CURRENT_MAP3=!VECTOR_CURRENT_MAP2:-latest=!"
ECHO !VECTOR_CURRENT_MAP3!>>%VECTOR_LOGFILE%
)