读取文件的每一行 - 批处理脚本

时间:2015-10-27 10:38:33

标签: windows batch-file sqlcmd

我要写一个批处理脚本。该脚本读取输入文件的行,并为每行执行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。

我已经在文件夹中了...

如果有人有任何想法,因为我的批处理脚本不是很好...而且我也不知道我的sqlcmd是否正确......

感谢您的帮助!

编辑:在wOxxOm& amp;迈克尔。

2 个答案:

答案 0 :(得分:2)

我不确定代码中是否有更多错误,但肯定是您遗漏了SETLOCAL EnableDelayedExpansion。您正在使用延迟展开(例如!nomfic!),但!...!在脚本开头没有SETLOCAL EnableDelayedExpansion时无效。

答案 1 :(得分: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 (