【问题标题】:Creating batch file from shell file从 shell 文件创建批处理文件
【发布时间】:2015-04-28 19:45:30
【问题描述】:

我必须将以下 shell 文件转换为批处理文件:

\#!/bin/bash
\#
\# Generates and compiles a lexer or parser and runs it (this means
\# that the lexer/parser must contain a main method)
\#
\# Example usage: antlr4-run.sh Lexer.g4

DIR="$(cd `dirname "${BASH_SOURCE[0]}"` && pwd)"
ANTLR_JAR=$DIR/lib/antlr-4.2.2-complete.jar
BASENAME="${1%.*}"
OUTDIR=out

echo "Generating..."
java -jar $ANTLR_JAR $1 -o $OUTDIR || exit 1

echo "Compiling..."
(cd $OUTDIR; javac -cp .:$ANTLR_JAR ${BASENAME}*.java) || exit 1

\#\# run (try parser first, then lexer, then plain)
echo "Input (end with ^D):"

if [[ -a $OUTDIR/${BASENAME}Parser.class ]] ; then
      (cd $OUTDIR; java -cp .:$ANTLR_JAR ${BASENAME}Parser) || exit 1 
elif [[ -a $OUTDIR/${BASENAME}Lexer.class ]] ; then
      (cd $OUTDIR; java -cp .:$ANTLR_JAR ${BASENAME}Lexer) || exit 1 
elif [[ -a $OUTDIR/${BASENAME}.class ]] ; then
      (cd $OUTDIR; java -cp .:$ANTLR_JAR ${BASENAME}) || exit 1 
fi

exit 1

你能帮我举个例子吗?

DIR="$(cd `dirname "${BASH_SOURCE[0]}"` && pwd)"

我知道我必须在批处理文件中使用 set Directory ="..." 定义一个变量,例如 $commandoline parameter... 但我不知道如何编写批处理文件中的行:/

【问题讨论】:

    标签: java linux bash shell batch-file


    【解决方案1】:

    您应该将变量名称 DIR 更改为其他名称(Win 不区分大小写,dir 是一个命令)。但是,这是等效的(查看[MS.Docs]: Batch parameters 了解更多详细信息):

    set _DIRNAME=%~dp0
    

    请注意,它不会删除尾随的反斜杠(“\”)。

    更多:如果尾随的“\”有问题,可以这样做:

    set _DIRNAME=%~dp0
    set _DIRNAME=%_DIRNAME:~0,-1%
    

    这是一种解决方法 (gainarie),但它确实有效。

    @EDIT0

    另外,发布(最后)评论中的代码。

    @EDIT1

    由于该方法不可靠(例如,如果扩展名存在于路径中的其他位置,它也将被删除),还发布了一种可行且只需要一行的替代方法:

    script.bat

    @echo off
    setlocal enabledelayedexpansion
    
    set _EXT=%~x1
    set _NAME_EXT=%~1
    set _NAME=!_NAME_EXT:%_EXT%=!
    
    echo Name (env vars): %_NAME%
    
    :: This does the trick, and it's waaay better in every possible way
    echo Name (bat args): %~d1%~p1%~n1
    

    输出

    e:\Work\Dev\StackOverflow\q029928513>script.bat "e:\Work\Dev\StackOverflow\q029928513\a.bat"
    Name (env vars): e:\Work\Dev\StackOverflow\q029928513\a
    Name (bat args): e:\Work\Dev\StackOverflow\q029928513\a
    
    e:\Work\Dev\StackOverflow\q029928513>script.bat "c:\dir_bat\a.bat"
    Name (env vars): c:\dir_bat\a
    Name (bat args): c:\dir_bat\a
    
    e:\Work\Dev\StackOverflow\q029928513>script.bat "c:\dir.bat\a.bat"
    Name (env vars): c:\dir\a
    Name (bat args): c:\dir.bat\a
    
    e:\Work\Dev\StackOverflow\q029928513>script.bat "c:\dir.batch\a.bat"
    Name (env vars): c:\dirch\a
    Name (bat args): c:\dir.batch\a
    
    e:\Work\Dev\StackOverflow\q029928513>script.bat "c:\dir.batch\a.bat1"
    Name (env vars): c:\dir.batch\a
    Name (bat args): c:\dir.batch\a
    
    e:\Work\Dev\StackOverflow\q029928513>script.bat "e:\Work\Dev\StackOverflow\q029928513\ a.bat"
    Name (env vars): e:\Work\Dev\StackOverflow\q029928513\ a
    Name (bat args): e:\Work\Dev\StackOverflow\q029928513\ a
    

    【讨论】:

    • 要同时删除结尾的“\”,您可以执行以下操作:code set DIRNAME_=%~dp0 set DIRNAME=%DIRNAME_:~0,-1% code 这是一个解决方法(gainarie),但它有效。
    • 谢谢!这样我就需要在 shell 脚本中为这一行编写所有内容了吗? BASH_SOURCE[0] 怎么样?你能帮我解决一下 BASENAME="${1%.*}" 行吗?我已经在寻找较早的帖子以及常见的 shell 和批处理 (cmd) 命令....
    • BASH_SOURCE[0] 是脚本的名称(当脚本运行来源时有效)。
    • 代码如下: setlocal enabledelayedexpansion set EXT=%~x1 set SELF=%~1 set BASENAME=!SELF:%EXT%=!
    猜你喜欢
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 2013-08-31
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多