Java 在.bat脚本(Windows)中修改和设置路径
我厌倦了修改我的路径来在java6/7/8之间交换,决定制作一个快速的.bat脚本来帮我完成 上一次迭代在我的上一台笔记本电脑上运行,但在我的新笔记本电脑上,上一次迭代和这次迭代似乎都不起作用 我要做的是获取我的PATH变量,将字符串“jdk#”替换为我打算使用的任何其他“jdk#”。JAVA_HOME的设置似乎执行得很好,整个脚本执行时没有错误,但是字符串替换似乎没有发生,我不知道为什么Java 在.bat脚本(Windows)中修改和设置路径,java,batch-file,cmd,path,Java,Batch File,Cmd,Path,我厌倦了修改我的路径来在java6/7/8之间交换,决定制作一个快速的.bat脚本来帮我完成 上一次迭代在我的上一台笔记本电脑上运行,但在我的新笔记本电脑上,上一次迭代和这次迭代似乎都不起作用 我要做的是获取我的PATH变量,将字符串“jdk#”替换为我打算使用的任何其他“jdk#”。JAVA_HOME的设置似乎执行得很好,整个脚本执行时没有错误,但是字符串替换似乎没有发生,我不知道为什么 @echo off @REM Cycle through all the arguments passe
@echo off
@REM Cycle through all the arguments passed in
for %%x in (%*) do (
@REM if the current argument is "mvn" switch the versions
IF "%%x"=="mvn" (
@REM Temporarily move to the Maven 2 directory
PUSHD C:\PROGRA~1\apache-maven-2.2.1\bin\
@REM if the RENAME file exists then Maven 3 was enabled and we need to rename it
IF EXIST "mvnRENAME.bat" (
REN "mvnRENAME.bat" "mvn.bat"
ECHO Maven 2 enabled
) ELSE (
@REM otherwise we need to hide the mvn.bat file to enable Maven 3
REN "mvn.bat" "mvnRENAME.bat"
ECHO Maven 3 enabled
)
@REM Return back to the original directory
POPD
)
@REM Swap to java 6
IF "%%x"=="java6" (
ECHO Java 6 enabled
@REM Replace instances of jdk7 with jdk6
set "PATH=%PATH:jdk7=jdk6%"
setx -m PATH "%PATH:jdk7=jdk6%"
echo.%PATH%
@REM Replace instances of jdk8 with jdk6
set "PATH=%PATH:jdk8=jdk6%"
setx -m PATH "%PATH:jdk8=jdk6%"
echo.%PATH%
@REM Set java home
set "JAVA_HOME=C:\PROGRA~1\Java\jdk6\"
setx -m JAVA_HOME C:\PROGRA~1\Java\jdk6\
)
)
运行此脚本似乎根本不会修改我的路径,因为路径之后仍然包含“C:\PROGRA~1\Java\jdk7\bin”
我是否误解了字符串:find=replace函数的工作原理?我的语法错了吗?任何帮助都将不胜感激
~~~~~~~~~~~~~~~~~~~~~
添加了SETLOCAL ENABLEDELAYEDEXPANSION,然后在下面做了这一点
set pathtext=!PATH:jdk7=jdk6!
echo.!pathtext!
set "!PATH!=!pathtext!"
setx -m !PATH! "!pathtext!"
变量pathtext现在包含我想要的路径(在当前命令行和系统中都是),但是set和setx方法没有达到我的预期。我想我是误会了怎么用这个词!此处的运算符。
%%x
是for变量,仅在for语句或(代码块)的范围内有效。在代码块内设置变量需要使用setlocal设置延迟扩展,并使用当在同一代码块中使用变量名时,使用code>而不是%
符号将其括起来。%%x很好,除了if语句之外,它不会在任何地方使用,并且按照预期工作。我仍然不太确定我是否会继续第二部分。由于我试图修改一个系统变量(包括本地变量和为系统实际设置的变量),在启用延迟扩展的情况下,该变量如何工作?我将对其进行编辑,以包含整个交换脚本。我使用for循环遍历传入的所有命令行参数,这部分工作正常。只是“查找/替换”似乎不起作用,因为该集合适用于JAVA_HOME。将修改后的路径的echo
移到Parenthisized块之外。有关说明,请参见延迟扩展
(许多项)。设置“!PATH!=!pathtext!”
尝试将名为(PATH的内容
)的变量设置为值(pathtext的内容
)。从path
中删除感叹号(与setx
命令相同)%%x
是for变量,仅在for语句或(代码块)的范围内有效。在代码块内设置变量需要使用setlocal设置延迟扩展,并使用当在同一代码块中使用变量名时,使用code>而不是%
符号将其括起来。%%x很好,除了if语句之外,它不会在任何地方使用,并且按照预期工作。我仍然不太确定我是否会继续第二部分。由于我试图修改一个系统变量(包括本地变量和为系统实际设置的变量),在启用延迟扩展的情况下,该变量如何工作?我将对其进行编辑,以包含整个交换脚本。我使用for循环遍历传入的所有命令行参数,这部分工作正常。只是“查找/替换”似乎不起作用,因为该集合适用于JAVA_HOME。将修改后的路径的echo
移到Parenthisized块之外。有关说明,请参见延迟扩展
(许多项)。设置“!PATH!=!pathtext!”
尝试将名为(PATH的内容
)的变量设置为值(pathtext的内容
)。从path
中删除感叹号(与setx
命令相同)