Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 剥离文件名的一部分并将其用于比较_Batch File_Batch Processing - Fatal编程技术网

Batch file 剥离文件名的一部分并将其用于比较

Batch file 剥离文件名的一部分并将其用于比较,batch-file,batch-processing,Batch File,Batch Processing,我正在为Windows命令行构建一个脚本,在该脚本中,我尝试检查循环中的一些文件名,然后将部分文件名剥离到一个变量中以供进一步使用。基本上,我想做的是: 列出某个目录中的所有文件,在本例中拆分扩展名,如.osm.pbf 将文件名分配给变量 在另一个变量中删除文件名的最后7个字符 将此新变量与“-latest”进行比较 如果比较为true,则剪切包含文件名的变量的一部分 如果比较为false,则将完整变量转换为另一个变量 通过一些尝试和错误以及一些在线搜索,我已经到达了这一点(这仍然不是我想要的)

我正在为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 with
    CALL/?
    的帮助说明了批处理文件或子例程(嵌入批处理文件中的批处理文件)的处理参数

    删除所有错误的代码:

    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%
    )