【问题标题】:Changing the path location of a file to the desired path将文件的路径位置更改为所需路径
【发布时间】:2013-09-20 09:37:27
【问题描述】:

我想将文件中定义的内容路径(即 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\”并设置到变量“文件夹”中。 现在文件夹位置中有一个名为 logging.properties 的文件 C:\Users\Anuj\Desktop\jboss7\standalone\configuration

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 文件时出现错误。

【问题讨论】:

  • @foxidrive :您是否删除了 cmets,因为我看不到它们?
  • 你有抛出的错误吗?消息或错误级别编号?

标签: batch-file


【解决方案1】:

虽然我无法帮助您解决您在使用 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\\ 的部分将被删除;

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

    • 新值被放回配置行;

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-23
    • 2015-06-05
    • 1970-01-01
    • 2021-10-12
    • 2012-01-31
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多