【问题标题】:Unwanted escape characters in string字符串中不需要的转义字符
【发布时间】:2009-12-08 15:22:29
【问题描述】:

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>

代码:

            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();

DTSARgs 的样子:

/N "BlockImportNEW" /G “{C22A80D9-7613-43AF-939C-3C04AD7D848A}” /F “\计算机名\文件夹名\文件夹1\文件夹2\文件夹3\文件名.dts” /A "目标数据库":"8"="DBNAME" /一种 "目的地密码":"8"="密码" /一种 "目标服务器名":"8"="服务器名" /一种 "DestinationTable":"8"="dbname.dbo.tablename" /一种 "目标用户名":"8"="用户名" /一种 "ImportFileConnection":"8"="file.txt';'';'0'" /A "导入文件名":"8"="file.txt" /A "ImportSourcePath":"8"="C:\BlockImport" /一种 "ImportWorkingPath":"8"="\computername\foldername\folder1\folder2" /一种 "ImportWorkingPathAndFileName":"8"="\computername\foldername\folder1\folder2\file.txt" /W "0"

proc.StartInfo.Arguments 的样子:

/N \"BlockImportNEW\" /G \"{C22A80D9-7613-43AF-939C-3C04AD7D848A}\" /F \"\\计算机名\文件夹名\folder1\folder2\folder3\filename.dts\" /一种 \"目标数据库\":\"8\"=\"DBNAME\" /一种 \"目标密码\":\"8\"=\"密码\" /一种 \"DestinationServerName\":\"8\"=\"ServerName\" /一种 \"DestinationTable\":\"8\"=\"dbname.dbo.tablename\" /一种 \"目标用户名\":\"8\"=\"用户名\" /一种 \"ImportFileConnection\":\"8\"=\"file.txt';'';'0'\" /一种 \"ImportFileName\":\"8\"=\"file.txt\" /一种 \"ImportSourcePath\":\"8\"=\"C:\BlockImport\" /一种 \"ImportWorkingPath\":\"8\"=\"\\computername\foldername\folder1\folder2\" /一种 \"ImportWorkingPathAndFileName\":\"8\"=\"\\computername\foldername\folder1\folder2\file.txt\" /W \"0\"

执行 proc.Start 时,由于所有额外的反斜杠,它无法正常工作。 似乎 DTSArgs stringbuilder 字符串格式正确,但是当通过 .ToString() 转换并存储在 proc.StartInfo.Arguments 中时,它会得到所有反斜杠。

我怎样才能避免发送 proc.StartInfo.Arguments 所有这些额外的反斜杠?

【问题讨论】:

    标签: c# escaping character


    【解决方案1】:

    我强烈怀疑它们实际上并不在字符串中。您是否有机会使用调试器?它显示了字符串的转义形式。

    将字符串写入控制台或类似的东西,你会看到真正的价值。

    【讨论】:

      【解决方案2】:

      你在用verbatim string literals吗?

      即:

      String c = @"C \B";
      

      【讨论】:

      • 你的意思是逐字字符串。只是 "x y" 是一个字符串文字。
      【解决方案3】:

      我确实发现它只在调试器和即时窗口中显示转义字符。当写出到进程时,它实际上被格式化了。我创建了一个简单的批处理文件:

      echo %1
      pause
      

      然后我用进程而不是我试图运行的 exe 调用批处理文件。 这样我就可以看到实际发送的内容。我之前的部分问题是 cmd 窗口关闭得太快了。

      感谢大家的帮助!

      【讨论】:

        猜你喜欢
        • 2010-10-21
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 2011-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        相关资源
        最近更新 更多