简体   繁体   English

字符串中不需要的转义字符

[英]Unwanted escape characters in string

App.Config file contents: App.Config文件内容:

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>

    <appSettings>
        <add key="ConnectionString"
             value="Server=ADVDSQLMGA;User ID=ImporterApp;Password=!mp0rt3rApp;Database=id0405Moxy52"
             />


        <add key="DTS_PackageName"
            value="BlockImportNEW"/>
        <add key="DTS_PackagePathAndFileName"
            value="\\computername\foldername\folder1\folder2\folder3\filename.dts"/>
        <add key="DTS_PackageGUID"
            value="{C22A80D9-7613-43AF-939C-3C04AD7D848A}"/>
        <add key="DTS_ImportSourcePath"
            value="C:\foldername"/>
        <add key="DTS_ImportFileConnection"
             value="'filename.txt';'';'0'"/>
        <add key="DTS_ImportFileName"
             value="filename.txt"/>
        <add key="DTS_ImportWorkingPath"
             value="\\computername\foldername\folder1\folder2"/>
        <add key="DTS_ImportWorkingPathAndFileName"
             value="\\computername\foldername\folder1\folder2\filename.txt"/>
        <add key="DTS_DestinationServerName"
             value="computername"/>
        <add key="DTS_DestinationDatabase"
             value="databasename"/>
        <add key="DTS_DestinationTable"
             value="databasename.dbo.tablename"/>
        <add key="DTS_DestinationUserName"
             value="username"/>
        <add key="DTS_DestinationPassword"
             value="password"/>
    </appSettings>


</configuration>

Code: 码:

            string DTS_PackageName = ConfigurationSettings.AppSettings["DTS_PackageName"];
            string DTS_PackagePathAndFileName = ConfigurationSettings.AppSettings["DTS_PackagePathAndFileName"];
            string DTS_PackageGUID = ConfigurationSettings.AppSettings["DTS_PackageGUID"];
            string DTS_ImportSourcePath = ConfigurationSettings.AppSettings["DTS_ImportSourcePath"];
            string DTS_ImportFileConnection = ConfigurationSettings.AppSettings["DTS_ImportFileConnection"];
            string DTS_ImportFileName = ConfigurationSettings.AppSettings["DTS_ImportFileName"];
            string DTS_ImportWorkingPath = ConfigurationSettings.AppSettings["DTS_ImportWorkingPath"];
            string DTS_ImportWorkingPathAndFileName = ConfigurationSettings.AppSettings["DTS_ImportWorkingPathAndFileName"];
            string DTS_DestinationServerName = ConfigurationSettings.AppSettings["DTS_DestinationServerName"];
            string DTS_DestinationDatabase = ConfigurationSettings.AppSettings["DTS_DestinationDatabase"];
            string DTS_DestinationTable = ConfigurationSettings.AppSettings["DTS_DestinationTable"];
            string DTS_DestinationUserName = ConfigurationSettings.AppSettings["DTS_DestinationUserName"];
            string DTS_DestinationPassword = ConfigurationSettings.AppSettings["DTS_DestinationPassword"];

            StringBuilder DTSArgs = new StringBuilder();

            DTSArgs.AppendFormat("/N \"{0}\" /G \"{1}\" /F \"{2}\" ",
                                        DTS_PackageName,
                                        DTS_PackageGUID,
                                        DTS_PackagePathAndFileName);            
            DTSArgs.AppendFormat(@"/A ""DestinationDatabase"":""8""=""{0}"" ", DTS_DestinationDatabase);
            DTSArgs.AppendFormat("/A \"DestinationPassword\":\"8\"=\"{0}\" ", DTS_DestinationPassword);
            DTSArgs.AppendFormat("/A \"DestinationServerName\":\"8\"=\"{0}\" ", DTS_DestinationServerName);
            DTSArgs.AppendFormat("/A \"DestinationTable\":\"8\"=\"{0}\" ", DTS_DestinationTable);
            DTSArgs.AppendFormat("/A \"DestinationUserName\":\"8\"=\"{0}\" ", DTS_DestinationUserName);
            DTSArgs.AppendFormat("/A \"ImportFileConnection\":\"8\"=\"{0}\" ", DTS_ImportFileConnection);
            DTSArgs.AppendFormat("/A \"ImportFileName\":\"8\"=\"{0}\" ", DTS_ImportFileName);
            DTSArgs.AppendFormat("/A \"ImportSourcePath\":\"8\"=\"{0}\" ", DTS_ImportSourcePath);
            DTSArgs.AppendFormat("/A \"ImportWorkingPath\":\"8\"=\"{0}\" ", DTS_ImportWorkingPath);
            DTSArgs.AppendFormat("/A \"ImportWorkingPathAndFileName\":\"8\"=\"{0}\" ", DTS_ImportWorkingPathAndFileName);
            DTSArgs.AppendFormat("/W \"0\"");

            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = "dtsrun ";
//**** PROBLEM IS HERE:  The DTSArgs escpaes the double-quotes and backslashes in paths with backslashes,
//**** then the dtsrun.exe doesn’t like the arguments (see string below)
            proc.StartInfo.Arguments = DTSArgs.ToString();

            proc.Start();

            proc.WaitForExit();

What DTSARgs looks like: DTSARgs的样子:

/N "BlockImportNEW" /G "{C22A80D9-7613-43AF-939C-3C04AD7D848A}" /F "\\computername\\foldername\\folder1\\folder2\\folder3\\filename.dts" /A "DestinationDatabase":"8"="DBNAME" /A "DestinationPassword":"8"="password" /A "DestinationServerName":"8"="ServerName" /A "DestinationTable":"8"="dbname.dbo.tablename" /A "DestinationUserName":"8"="userName" /A "ImportFileConnection":"8"="file.txt';'';'0'" /A "ImportFileName":"8"="file.txt" /A "ImportSourcePath":"8"="C:\\BlockImport" /A "ImportWorkingPath":"8"="\\computername\\foldername\\folder1\\folder2" /A "ImportWorkingPathAndFileName":"8"="\\computername\\foldername\\folder1\\folder2\\file.txt" /W "0" / N“BlockImportNEW”/ G“{C22A80D9-7613-43AF-939C-3C04AD7D848A}”/ F“\\ computername \\ foldername \\ folder1 \\ folder2 \\ folder3 \\ filename.dts”/ A“DestinationDatabase”:“8”=“DBNAME “/ A”DestinationPassword“:”8“=”password“/”DestinationServerName“:”8“=”ServerName“/”DestinationTable“:”8“=”dbname.dbo.tablename“/”DestinationUserName“: “8”=“userName”/“ImportFileConnection”:“8”=“file.txt';'';'0'”/ A“ImportFileName”:“8”=“file.txt”/ A“ImportSourcePath” :“8”=“C:\\ BlockImport”/“ImportWorkingPath”:“8”=“\\ computername \\ foldername \\ folder1 \\ folder2”/“ImportWorkingPathAndFileName”:“8”=“\\ computername \\ foldername \\ folder1 \\ folder2 \\ file.txt“/ W”0“

What proc.StartInfo.Arguments looks like: proc.StartInfo.Arguments看起来像什么:

/N \\"BlockImportNEW\\" /G \\"{C22A80D9-7613-43AF-939C-3C04AD7D848A}\\" /F \\"\\\\computername\\foldername\\folder1\\folder2\\folder3\\filename.dts\\" /A \\"DestinationDatabase\\":\\"8\\"=\\"DBNAME\\" /A \\"DestinationPassword\\":\\"8\\"=\\"password\\" /A \\"DestinationServerName\\":\\"8\\"=\\"ServerName\\" /A \\"DestinationTable\\":\\"8\\"=\\"dbname.dbo.tablename\\" /A \\"DestinationUserName\\":\\"8\\"=\\"userName\\" /A \\"ImportFileConnection\\":\\"8\\"=\\"file.txt';'';'0'\\" /A \\"ImportFileName\\":\\"8\\"=\\"file.txt\\" /A \\"ImportSourcePath\\":\\"8\\"=\\"C:\\BlockImport\\" /A \\"ImportWorkingPath\\":\\"8\\"=\\"\\\\computername\\foldername\\folder1\\folder2\\" /A \\"ImportWorkingPathAndFileName\\":\\"8\\"=\\"\\\\computername\\foldername\\folder1\\folder2\\file.txt\\" /W \\"0\\" / N \\“BlockImportNEW \\”/ G \\“{C22A80D9-7613-43AF-939C-3C04AD7D848A} \\”/ F \\“\\\\ computername \\ foldername \\ folder1 \\ folder2 \\ folder3 \\ filename.dts \\”/ A \\“DestinationDatabase \\“:\\”8 \\“= \\”DBNAME \\“/ A \\”DestinationPassword \\“:\\”8 \\“= \\”password \\“/ A \\”DestinationServerName \\“:\\”8 \\“= \\”ServerName \\“/ A \\”DestinationTable \\“:\\”8 \\“= \\”dbname.dbo.tablename \\“/ A \\”DestinationUserName \\“:\\”8 \\“= \\”userName \\“/ A \\”ImportFileConnection \\ “:\\”8 \\“= \\”file.txt';'';'0'\\“/ A \\”ImportFileName \\“:\\”8 \\“= \\”file.txt \\“/ A \\”ImportSourcePath \\ “:\\”8 \\“= \\”C:\\ BlockImport \\“/ A \\”ImportWorkingPath \\“:\\”8 \\“= \\”\\\\ computername \\ foldername \\ folder1 \\ folder2 \\“/ A \\”ImportWorkingPathAndFileName \\“ :\\“8 \\”= \\“\\\\ computername \\ foldername \\ folder1 \\ folder2 \\ file.txt \\”/ W \\“0 \\”

When proc.Start is executed, it doesn't work correctly because of all the extra backslashes. 执行proc.Start时,由于所有额外的反斜杠,它无法正常工作。 It seems the DTSArgs stringbuilder string is in the correct format, but when converted via .ToString() and stored in proc.StartInfo.Arguments it gets all the backslashes. 似乎DTSArgs stringbuilder字符串格式正确,但是当通过.ToString()转换并存储在proc.StartInfo.Arguments中时,它会获得所有反斜杠。

How can I keep from sending proc.StartInfo.Arguments all those extra backslashes? 我如何避免发送proc.StartInfo.Arguments所有这些额外的反斜杠?

I strongly suspect they aren't really in the string. 我强烈怀疑他们不是真的在弦乐中。 Are you using the debugger by any chance? 您是否有机会使用调试器? It shows an escaped form of the string. 它显示了字符串的转义形式。

Write the string to the console or something similar and you'll see the real value. 将字符串写入控制台或类似的东西,你会看到真正的价值。

Are you using verbatim string literals ? 你使用的是逐字字符串文字吗?

Ie : 即:

String c = @"C \B";

I did find that it was only showing with the escape characters in the debugger and immediate window. 我确实发现它只是在调试器和即时窗口中显示转义字符。 When written out to the Process, it was actually formatted corrected. 当写入Process时,它实际上已经过格式化校正。 I created a batch file that simply did this: 我创建了一个简单的批处理文件:

echo %1
pause

Then I called the batch file with the Process instead of the exe I was trying to run. 然后我用Process调用批处理文件而不是我试图运行的exe。 That way I could see what was actually being sent. 这样我就能看到实际发送的内容。 Part of my problem before was that the cmd window closed too fast. 之前我的部分问题是cmd窗口关闭得太快了。

Thanks for the help guys! 谢谢你的帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM