Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows批处理中-如何用转义单引号替换单引号以提供SQL_Sql_Windows_Batch File_Escaping_Quote - Fatal编程技术网

在Windows批处理中-如何用转义单引号替换单引号以提供SQL

在Windows批处理中-如何用转义单引号替换单引号以提供SQL,sql,windows,batch-file,escaping,quote,Sql,Windows,Batch File,Escaping,Quote,对于我的Windows批处理文件,我有以下SQL语句: FOR /F "eol=; tokens=1,2,3,4,5,6* delims=, " %a in (myfile.txt) do( sqlcmd -SmYSerbver -Uhhh -P12345 -dmyDB_Admin -Q"insert into tableA (UserID,FirstName,LastName,Email,DisplayName,OrgUnit,LoadDate) values('%%a','%%b'

对于我的Windows批处理文件,我有以下SQL语句:

FOR /F "eol=; tokens=1,2,3,4,5,6* delims=, " %a in (myfile.txt) do(
    sqlcmd -SmYSerbver  -Uhhh -P12345 -dmyDB_Admin -Q"insert into tableA (UserID,FirstName,LastName,Email,DisplayName,OrgUnit,LoadDate) values('%%a','%%b','%%c','%%d','%%e','%%f',getdate())"
)
一个用户的姓氏是“O'Brien”-我的变量%%c计算为O'Brien


如何将%%c计算为“O”型变量?

您需要一个临时变量来替换字符串,因为相关语法不能直接应用于
变量,如
%%c
。要使其工作,需要启用,并且需要使用
扩展临时变量而不是
%%

下面说明了如何使用中间变量
c\u tmp
%%c
中的值实现该操作:

setlocal EnableDelayedExpansion
for /F "eol=; tokens=1,2,3,4,5,6* delims=, " %%a in (myfile.txt) do (
    set "c_tmp=%%c" & set "c_tmp=!c_tmp:'=''!"
    sqlcmd -SmYSerbver  -Uhhh -P12345 -dmyDB_Admin -Q"insert into tableA (UserID,FirstName,LastName,Email,DisplayName,OrgUnit,LoadDate) values('%%a','%%b','!c_tmp!','%%d','%%e','%%f',getdate())"
)
endlocal
%%c
包含字符串
O'Brien
时,
c\u tmp
最终将包含
O'Brien


当然,您也可以通过修改命令
相应地设置“c\u tmp=!c\u tmp:'=''!
来进行其他替换。

如果sqlcmd插入失败,您可以使用
\
来转义单引号

如果包含单引号的文件不用于值的定界,则可以替换中间文件中的所有引用

(
echo O'Brian1a, O'Brian1b, O'Brian1c, O'Brian1d, O'Brian1e, O'Brian1f
echo O'Brian2a, O'Brian2b, O'Brian2c, O'Brian2d, O'Brian2e, O'Brian2f
echo O'Brian3a, O'Brian3b, O'Brian3c, O'Brian3d, O'Brian3e, O'Brian3f
)>%tmp%\myfile.tmp

( 
  for /f "delims=" %%i in (%tmp%\myfile.tmp) do (
    set "i=%%i"
    setlocal enabledelayedexpansion
    echo !i:'=\'!
  )
)>%tmp%\int-myfile.tmp

for /f "tokens=1-6 delims=, " %%a in (%tmp%\int-myfile.tmp) do ( 
  echo '%%a','%%b','%%c','%%d','%%e','%%f'
)
输出:

'O\'Brian1a','O\'Brian1b','O\'Brian1c','O\'Brian1d','O\'Brian1e','O\'Brian1f'
'O\'Brian2a','O\'Brian2b','O\'Brian2c','O\'Brian2d','O\'Brian2e','O\'Brian2f'
'O\'Brian3a','O\'Brian3b','O\'Brian3c','O\'Brian3d','O\'Brian3e','O\'Brian3f'

作为最后手段,您始终可以选择在以下行中替换哪个字符:
echo!i:“=\”

请提供更多代码;所有
%%
变量从何而来?我使用了以下字符串替换,但它不起作用:set%%b=%%b:'=''%set%%a=%%a:'=''%set%%f=%%%f:'=''%set%%c=%%%c:'=''%set%%d=%%%d:'=''%“正常”变量,但由于
而延迟扩展,并在
do和之间插入一个空格(…并且它必须为/F%%a(非
%a
)读取
)…这是我第一次编写窗口批处理。你能给我看几行示例代码吗?我用两个单引号替换了它,它可以工作:设置“c_tmp=%%c”&设置“c_tmp=!c_tmp:'=''”!“啊,显然我把
'
误读为
…不管怎样,你已经知道了它的工作原理,并且自己做了修改…因此我调整了我的答案以符合这一点…我想做同样的转义,但我的输入是一个环境变量,而不是一个文件。我已经设置了“Name=O'Brien”
因此,如果我执行
echo%Name%
操作,则输出为
O'Brien
。如何定义SafeName变量,以便如果执行
echo%SafeName%
操作,则输出为
O'Brien
(这是名称的内容,但每个撇号都替换为两个撇号)?---编辑:显然它与
设置一样简单“Safename=%Name:”=''%”