2014-01-31 114 views
1

我有一個數據文件,它保存在以下格式(with | as delimiter)數據庫連接信息處理特殊字符在外部數據文件中的FOR命令:在批處理文件

DatabaseServerIp1|UserName1|Password1|DatabaseName1 
DatabaseServerIp2|UserName2|Password2|DatabaseName2 
DatabaseServerIp3|UserName3|Password3|DatabaseName3 

而且我有一個批處理文件,其讀取此文件的內容並使用該內容在此文件中的每個數據庫上執行腳本。這個腳本在大多數情況下效果很好,但當其中一個變量包含一個特殊字符如%@時會遇到問題。

我在網上閱讀,我應該使用「SETLOCAL EnableDelayedExpansion」,並用驚歎號包圍變量,但我無法得到它的工作。其他一些帖子也提到使用引號而不是感嘆號,但我無法讓這個工作。

我想避免更改DATA文件的內容(我不想在DATA文件中添加轉義字符)。

中,我想使用這個腳本:

rem ... more code here ... 

FOR /F "eol== delims=| tokens=1,2,3,4" %%i IN (%DATABASEDATAFILE%) DO CALL :_ACTION %%i %%j %%k %%l 
GOTO :_END 

:_ACTION 

IF "%1"=="" GOTO :EOF 

SET IPSERVER=%1 
SET USERNAME=%2 
SET PASSWORD=%3 
SET DATABASE=%4 

sqlcmd -S%IPSERVER% -U%USERNAME% -P%PASSWORD% -d%DATABASE% -i%SCRIPTFILE% -o%RESULTFILE% 

GOTO EOF 

:_END 

rem ... more code here ... 

:EOF 

如何使此代碼正確處理特殊字符?

示例:%-密碼字段中的字符。

正如你可能已經猜到的,我不是這個批處理文件或數據文件的原始創建者。

回答

1

您的大部分建議(延遲擴展,引號)都是正確的,但順序很重要。

setlocal DisableDelayedExpansion 
FOR /F "eol== delims=| tokens=1,2,3,4" %%i IN (%DATABASEDATAFILE%) DO (
    SET "IPSERVER=%%i 
    SET "USERNAME=%%j" 
    SET "PASSWORD=%%k" 
    SET "DATABASE=%%l" 

    CALL :ACTION 
) 
goto :EOF 

:ACTION 
setlocal EnableDelayedExpansion 

sqlcmd -S!IPSERVER! -U!USERNAME! -P!PASSWORD! -d!DATABASE! -i!SCRIPTFILE! -o!RESULTFILE! 

endlocal 
goto :EOF 
+0

+1這是一個很好的解決方案(一些錯別字固定) – foxidrive

1
@ECHO OFF 
SETLOCAL 
FOR /f "tokens=1-4delims=|" %%a IN (%DATABASEDATAFILE%) DO ECHO sqlcmd -S%%a -U%%b -P%%c -d%%d -i%SCRIPTFILE% -o%RESULTFILE% 

GOTO :EOF 

應該做的伎倆。我只是ECHO編輯SQL線產生 - 驗證後,您需要更改ECHO sqlcmdsqlcmd執行sqlcmd。