我要写一个批处理脚本。该脚本读取输入文件的行,并为每行执行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;迈克尔。
答案 0 :(得分:2)
我不确定代码中是否有更多错误,但肯定是您遗漏了SETLOCAL EnableDelayedExpansion
。您正在使用延迟展开(例如!nomfic!
),但!...!
在脚本开头没有SETLOCAL EnableDelayedExpansion
时无效。
答案 1 :(得分:1)
好的,在聊天讨论中排除故障之后,让我们总结一下问题:
for /f
无法与通配符一起使用。在另一个外for
循环中枚举文件并使用for /f
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 (