我想将定义到文件中的内容路径(即logging.properties)替换为jboss7位置的所需位置路径。
基本上我使用安装程序,我必须浏览我的jboss7文件夹并将其定位到用户的任何所需位置。但是在jboss7的少数文件中,有一些硬编码路径被定义,就像给定的logging.properties文件一样。
我需要将该硬编码路径更改为所需的位置路径。
截至目前,我正在使用repl.bat并将test.bat文件归档到同一文件夹中。
repl.bat帮助文件可以在以下链接中找到: -
http://www.dostips.com/forum/viewtopic.php?f=3&t=3855
我刚刚复制了代码并创建了repl.bat文件。
test.bat文件: -
@ECHO OFF
SETLOCAL
SET "folder="
FOR /r "C:\" %%a IN (tintin.txt) do IF EXIST "%%a" SET "folder=%%~dpa"&GOTO got1
FOR /r "D:\" %%a IN (tintin.txt) do IF EXIST "%%a" SET "folder=%%~dpa"&GOTO got1
:got1
echo "%folder%"
PAUSE
set "newpath=%folder%"
set "newpath=%newpath:\=\\%"
echo "%newpath%"
PAUSE
type "logging.properties" | repl "(Directory=).*(\\\\standalone\\\\)" "$1%newpath%$2">"logging.properties.tmp"
PAUSE
move "logging.properties.tmp" "logging.properties"
PAUSE
GOTO :EOF
PAUSE
在这个test.bat文件中,我正在搜索文件tintin.txt文件,并将路径设置为变量名称为'folder'。 tintin.txt文件就在jboss7的文件夹里面。这是因为有多个jboss7应用服务器文件夹进入系统的可能性。 直到现在我有了路径,即“C:\ Users \ Anuj \ Desktop \ jboss7 \”并设置为变量'folder'。 现在有一个名为logging.properties的文件到文件夹位置 C:\ Users \用户Anuj \桌面\ jboss7 \独立\配置
logging.properties: -
com.latilla.import.uploadDirectory=C:\\progra~2\\Latilla\\C4i\\jboss7\\ standalone\\uploads
com.latilla.import.maxFilesUploadNumber=10
com.latilla.export.templateFile=C:\\progra~2\\Latilla\\C4i\\jboss7\\standalone\\templates\\GDV_HDI_Format.xls
com.latilla.etl.pluginsRootDirectory=C:\\progra~2\\Latilla\\C4i\\jboss7\\standalone\\cloverETL\\plugins
com.latilla.etl.templatesDirectory=C:\\progra~2\\Latilla\\C4i\\jboss7\\standalone\\etl
com.latilla.db.user=postgres
com.latilla.db.pass=password
repl.bat帮助文件有助于用所需的路径替换url路径,即路径设置为变量名'folder'。 我想用路径设置为变量名'folder'来替换C:\ progra~2 \ Latilla \ C4i \ jboss7 \。 注意: - 这里的logging.properties文件路径内容有不同的路径格式,即C:\ 意味着双斜线。的 \
可能是我尝试过的脚本test.bat不正确。 当我双击test.bat文件时出现错误。
答案 0 :(得分:3)
虽然我无法帮助您解决使用repl.bat
文件时遇到的问题,但我可以提出一种解决路径替换初始问题的不同方法。
如果保证配置文件中的所有原始路径中都存在jboss7
字符串,则可以尝试以下方法:
@ECHO OFF
SETLOCAL DisableDelayedExpansion
FOR /F "delims=" %%A IN ('DIR /B /S C:\tintin.txt') DO (CD /D "%%~dpA" & CALL :got1)
FOR /F "delims=" %%A IN ('DIR /B /S D:\tintin.txt') DO (CD /D "%%~dpA" & CALL :got1)
GOTO :EOF
:got1
SET "propfile=%CD%\standalone\configuration\logging.properties"
IF NOT EXIST "%propfile%" GOTO :EOF
SET "tempfile=%TEMP%\logging.properties.tmp"
FIND /I /V "jboss7\\" >"%tempfile%"
>>"%tempfile%" (
FOR /F "tokens=1,* delims=" %%I IN ('FIND /I "jboss7\\"') DO (
SET "pathname=%%J"
SETLOCAL EnableDelayedExpansion
IF NOT "!pathname!" == "!pathname:*jboss7\\=!" (
SET "pathname=%__CD__:\=\\%!pathname:*jboss7\\=!"
)
ECHO %%I=!pathname!
ENDLOCAL
)
)
ECHO Old file "%propfile%":
TYPE "%propfile%"
ECHO =======================================
ECHO New file:
TYPE "%tempfile%"
PAUSE
:: uncomment the next line once you have verified the replacement works correctly
::MOVE "%tempfile%" "%propfile%"
搜索tintin.txt
文件已略有改动,以便更快地完成此过程。循环现在读取DIR
的输出,而不是遍历每个目录并检查它是否包含文件,而FOR /R
只返回实际存在的条目。
请注意,您也可以像在当前代码中一样使用tintin.txt
循环,效果相同,即只返回现有路径,但IN子句需要包含掩码而不是普通名称,但是这必须是一个与你的系统中的任何其他东西都不匹配的掩码,而不仅仅是tintin.txt1
。例如,如果您确定不存在名为tintin.txtx
或tintin.txt
的文件或其他任何FOR /R "C:\" %%A IN (tintin.txt?) DO (CD /D "%%~dpA" & CALL :got1)
后面只有一个字符的文件,则可以使用以下模板:
D:\
和GOTO
相同。这将只返回对实际存在的文件的引用并匹配掩码。
此外,您可以看到循环不会跳转(got1
)到got1
标签,而是调用 GOTO
子例程。通过该更改,可以一次处理许多应用程序实例。我不知道你的可以安装多次。如果没有,您可能希望将其更改回...\standalone\configuration\logging.properties
。
我脚本中的子例程使用描述中指定的完整路径引用配置文件(jboss7\\
)。出于某种原因,在您的脚本中,文件仅通过其名称引用,即使没有先前的CD或PUSHD命令将当前目录更改为文件的位置。我假设你试图简化你的脚本并省略那个位,无论是否有意。否则我可能在你的解释和/或剧本中遗漏了一些东西。
在验证配置文件存在于预期位置后,替换本身就是以这种方式完成的:
所有非路径配置行都一次性写入临时文件。
包含路径的每个配置行都以这种方式处理:
如果它不包含jboss7\\
字符串,则省略;
否则将移除包含\
的路径部分;
在剩余部分之前插入当前目录(在\\
替换每个{{1}}之后);
将新值重新放回配置行;
更新行将添加到同一临时文件中。
旧版本的配置文件已替换为新版本。
显然,脚本可能会更改已处理文件中的行顺序,但假设 无关紧要。