8

我想将文件中定义的内容路径(即 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 文件并将路径设置为变量名称为“文件夹”。tintin.txt 文件就在 jboss7 的文件夹内。这是因为系统中可能有多个 jboss7 应用服务器文件夹。到目前为止,我已经获得了路径,即“C:\Users\Anuj\Desktop\jboss7\”并设置到变量“文件夹”中。现在在文件夹位置 C:\Users\Anuj\Desktop\jboss7\standalone\configuration 中有一个名为 logging.properties 的文件

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 路径替换为所需的路径,即设置为变量名称“文件夹”的路径。我想将 C:\progra~2\Latilla\C4i\jboss7\ 替换为设置为变量名“文件夹”的路径。 注意:- 在 logging.properties 文件中的路径内容具有不同的路径格式,即 C:\ 表示双斜杠。\

可能是我尝试过的脚本 test.bat 不正确。当我双击 test.bat 文件时出现错误。

4

1 回答 1

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循环,如在您当前的代码中,具有相同的效果,即仅返回现有路径,但 IN 子句需要包含掩码而不是普通名称,但这必须是一个掩码无法匹配系统中的任何其他内容,而不仅仅是tintin.txt. 例如,如果您确定没有文件被调用tintin.txt1tintin.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我的脚本中的子例程使用您的描述 ( )中指定的完整路径引用配置文件。出于某种原因,在您的脚本中,文件仅通过其名称引用,即使前面没有 CD 或 PUSHD 命令将当前目录更改为文件的位置。我假设您正在尝试简化您的脚本并忽略了这一点,无论是否有意。否则我可能错过了您的解释和/或脚本中的某些内容。

在验证配置文件存在于预期位置后,替换本身是通过这种方式完成的:

  1. 一次性将所有非路径配置行写入临时文件。

  2. 每个包含路径的配置行都以这种方式处理:

    • 如果不包含jboss7\\字符串,则省略;

    • 否则,路径的直到和包括的部分jboss7\\被删除;

    • 当前目录插入到剩余部分之前(在 every\替换为之后\\);

    • 新值被放回配置行;

    • 更新行被添加到同一个临时文件中。

  3. 旧版本的配置文件替换为新版本。

显然,脚本可能会更改已处理文件中的行顺序,但假定这无关紧要

于 2013-09-26T17:30:46.887 回答