цикл не работает в Windows .bat файле - PullRequest
1 голос
/ 22 октября 2019

Мне нужен , который будет помещен в путь к серверу. Мои файлы данных расположены по другому пути.

  1. После запуска файла bat он должен найти список файлов по указанному пути (может быть в том же пути, где размещен файл bat).
  2. Должен искать косую черту /, косую черту \, специальные символы и заменять пробелом

образец Исходный файл

Исправленный файл

Я использовал следующий код: - он работает для одного файла. Когда я открываю петлю, это не работает. Пожалуйста, помогите.

, а также файл, который заканчивается на * .err, НЕ должен быть выбран из этого цикла.

    @echo off
Title Replace String using Regex with vbscript
setlocal EnableDelayedExpansion
Set "MYDIR=\\server01\Import\LoadError\dump"
for /F %%x in ('dir /B/D %MYDIR%') do (
Set "InputFile=%MYDIR%\%%x"
::Set "InputFile=\\server01\Import\LoadError\dump\KEG_OAP671A4_55555.txt"
Set "TmpFile=%Tmp%\%~n0.txt"
:: To write Result in a temporary file
Call :Search_Replace "%InputFile%" "%TmpFile%"
:: Replace and move contents from the temporary file to the original
Move /Y "%TmpFile%" "%InputFile%">nul
Start "" "%InputFile%" & Exit
::-----------------------------------------------------------------------------------
:Search_Replace <InputFile> <TmpFile>
(
    echo WScript.StdOut.WriteLine Search_Replace(Data^)
    echo Function Search_Replace(Data^)
    echo Dim strPattern, strReplace, strResult,oRegExp
    echo Data = "%~1" 
    echo Data = WScript.StdIn.ReadAll
    echo strPattern = "[\\\/\/]"
    echo strReplace = " "
    echo Set oRegExp = New RegExp
    echo oRegExp.Global = True 
    echo oRegExp.IgnoreCase = True 
    echo oRegExp.Pattern = strPattern
    echo strResult = oRegExp.Replace(Data,strReplace^)
    echo Search_Replace = strResult
    echo End Function
)>"%tmp%\%~n0.vbs"
cscript //nologo "%tmp%\%~n0.vbs" < "%~1" > "%~2"
If Exist "%tmp%\%~n0.vbs" Del "%tmp%\%~n0.vbs"
Exit /B
::----------------------------------------------------------------------------------
)

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Попробуйте и скажите мне, если это работает на вашей стороне:

Я добавил новую строку для резервного копирования вашей папки дампа и ее содержимого, если что-то пошло не так!

@echo off
Mode 85,35 & color 0A
Title Replace Multi String using Regex with vbscript into Folder with text files
Set "Source_Folder=\\server01\Import\LoadError\dump"
Set "Backup_Folder=%userprofile%\Backup_dump\"
Rem :: Just make a backup of your folder and its contents if something went wrong!
If Not Exist "%Backup_Folder%" XCopy "%Source_Folder%" "%Backup_Folder%" /D /Y /E /F >%~dp0BackupLogFile.txt
Set "VBSFILE=%tmp%\%~n0.vbs" & Call :CreateVBS
Set "TmpFile=%Temp%\%~n0.tmp"

for /R "%Source_Folder%" %%f in (*.txt) do (
    echo( ------------------------------------------
    echo  Replacing Contents of "%%f"
    echo( ------------------------------------------
    Call :Search_Replace "%%f" "%TmpFile%"
    Move /Y "%TmpFile%" "%%f">nul
)

Timeout /T 2 /NoBreak>nul & Exit
::-----------------------------------------------------------------------------
:CreateVBS
(
    echo WScript.StdOut.WriteLine Search_Replace(Data^)
    echo Function Search_Replace(Data^)
    echo Dim strPattern, strReplace, strResult,oRegExp
    echo Data = "%~1" 
    echo Data = WScript.StdIn.ReadAll
    echo strPattern = "[\\\/\/]"
    echo strReplace = " "
    echo Set oRegExp = New RegExp
    echo oRegExp.Global = True 
    echo oRegExp.IgnoreCase = True 
    echo oRegExp.Pattern = strPattern
    echo strResult = oRegExp.Replace(Data,strReplace^)
    echo Search_Replace = strResult
    echo End Function
)>"%VBSFILE%"
Exit /b 
::----------------------------------------------------------------------------
:Search_Replace <InputFile> <OutPutFile>
Cscript //nologo "%VBSFILE%" < "%~1" > "%~2"
Exit /B
::----------------------------------------------------------------------------
0 голосов
/ 22 октября 2019

@ Карун. Я думаю, вам лучше попробовать какой-нибудь bash-скрипт вместо bat.

Вы можете использовать SED Stream Editor для поиска и замены символов из файла.

Пример:

sed -i 's#\\##g' sample.txt # This will replace back slash from sample.txt
sed -i 's#/##g' sample.txt # This will replace forward slash from sample.txt

Чтобы выполнить несколько файлов в каталоге, вы также можете использовать цикл for. Сохраните все свои команды замены строк в сценарии bash, например test.sh, и выполните его, используя цикл for.

Пример:

sed -i 's#\\##g' $1
sed -i 's#/##g' $1

Добавьте строки выше в test.sh и запустите нижеСтрока сценария.

for file in $(ls -l /home/abc/*.txt | awk '{print $NF}'); do bash test.sh $file; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...