将文件的路径位置更改为所需的路径

时间:2013-09-20 09:37:28

标签: batch-file

我想将定义到文件中的内容路径(即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文件时出现错误。

1 个答案:

答案 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.txtxtintin.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命令将当前目录更改为文件的位置。我假设你试图简化你的脚本并省略那个位,无论是否有意。否则我可能在你的解释和/或剧本中遗漏了一些东西。

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

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

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

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

    • 否则将移除包含\的路径部分;

    • 在剩余部分之前插入当前目录(在\\替换每个{{1}}之后);

    • 将新值重新放回配置行;

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

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

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