2015-10-27 3 views
0

Я должен написать пакетный скрипт. Сценарий считывает строки входных файлов, и для каждой строки выполняется sqlcmd. Но когда я исполняю мой сценарий, это не работает, как я хочу, на самом деле это не делает работу ...прочитайте каждую строку файла - Пакетный скрипт

Моя партия сценарий:

@echo off 

SETLOCAL EnableDelayedExpansion 

set Chemin=C:\users\documents\Communication\Test\MSG_IN 

set NomFichierU=UHMSO_1 
set user=admin 
set pwd=admin 
set db=DTBASE_001 

cd /d %Chemin% 
set nomfic=%NomFichierU% 
set HHMMSS=A 
set HHMMSS=%LTIME:~0,2%%LTIME:~3,2%%LTIME:~6,2% 
for %%f IN (%NomFichierU%*.txt) DO (
    for /f tokens^=*^ delims^=^ eol^= %%l IN (%%f) DO (
     echo test 
     REM echo %%l 
     ECHO %%G 
     set nomficr=%%a 
     set nomfic=!nomficr:~0,-1!.tmp 
     REN %%a !nomfic! 
     rem executer sript MHUHMS.sql avec sqlplus 
     sqlcmd -S MILCS02 -U %user% -P %pwd% -d %db% -i c:\users\documents\SQL\MHUHMS.sql 
     move !nomfic! SLD_SLDHI\SAVE 
    ) 
) 

И MHUHMS.SQL просто сделать обновление в базе данных. Моя проблема в том, что когда я выполняю пакетный скрипт, он просто помещает меня в папку «Chemin», но я хочу, чтобы он читал файл, такой как UHMSO_1_XXXXX.txt. И после, для каждой строки моих файлов, он запускает мой sql-скрипт.

Моя ошибка на данный момент: Система не может найти файл UHMSO_1 * .txt.

И я palced в папке ...

Если кто-то есть какие-либо идеи, потому что я не очень хорошо в пакетном сценарии ... и я не знаю тоже, если мой SQLCMD правильно или нет ...

Спасибо за помощь!

EDIT: после получения справки от wOxxOm & MichaelS.

ответ

1

Хорошо, после устранения неполадок его в обсуждении чата давайте подведем вопросы:

  • for /f не может быть использован с групповыми символами. Перечислят файлы в качестве дополнительного внешнего for цикла и использовать переменный цикл в for /f
  • текстовых файлов были в UTF-16 кодировке, использовать for ... ('type "filename"') ...
  • sqlcmd может видеть только нормальную пакетные переменные, а не переменный цикл, как %%l так pass it with -v
  • все линии с nomfic, %%a и %%G не нужны
  • использование cd /d c:\some\path на самом деле изменить рабочий диск и путь.
    Или лучше даже pushd c:\some\path + popd для сохранения и восстановления предыдущей рабочей папки.
  • move файл только после того, как будут обработаны все строки
  • SETLOCAL EnableDelayedExpansion не требуется для отправленного фрагмента кода

set Chemin=C:\users\documents\Communication\Test\MSG_IN 
set NomFichierU=UHMSO_1 
set HHMMSS=%TIME:~0,2%%TIME:~3,2%%TIME:~6,2% 

pushd %Chemin% 
for /f "delims=" %%f IN ('dir /b "%NomFichierU%*.txt"') DO (
    for /f tokens^=*^ delims^=^ eol^= %%l IN ('type "%%f"') DO (
     sqlcmd -S MILCS02 -U %user% -P %pwd% -d %db%^
       -i c:\users\documents\SQL\MHUHMS.sql -v l ="%%l" 
    ) 
    move "%%f" "SLD_SLDHI\SAVE\%%f.%HHMMSS%" 
) 
popd 
pause 

P.S. В случае, если имена файлов могут содержать пробелы использовать usebackq и процитировать переменную:

for /f usebackq^ tokens^=*^ delims^=^ eol^= %%l IN ("%%f") DO (
+0

Давайте продолжим обсуждение в чате (http: //chat.stackoverflow.ком/комнаты/93506/обсуждение промежуточности woxxom-и-с-Гийом). – wOxxOm

2

я не уверен, если есть больше ошибок в коде, но один, безусловно, что вам не хватает SETLOCAL EnableDelayedExpansion. Вы используете задержанное расширение (например, !nomfic!), но !...! бесполезно без SETLOCAL EnableDelayedExpansion в начале вашего скрипта.

+0

Спасибо за ваш вклад, я добавляю это! –

+0

Не могли бы вы также обновить свой код в вопросе? Думаю, код все еще не работает? – MichaelS

+0

Да ... Это не работает ... Но теперь это не так, как раньше. До того, как я был помещен в каталог «Chemin». Теперь я в директории в начале, где я выполняю мой .bat. Так что я думаю, что это хорошо ... Я обновляю свой код –

Смежные вопросы