在C#中转义命令行参数以用于URL和本地和网络路径

Escaping command line arguments in C# for Urls and Local and Network Paths

如何提供自动转义到控制台应用程序的输入字符串?

我是说在我的代码里,我可以

1
2
3
4
5
6
public static void main(string[] args)
{
     string myURL;
     myFolder = @"C:\temp\january";  //just for testing
     myFolder = args[0]; // I want to do this eventually
}

如何在不必通过命令行手动转义的情况下为我的文件夹提供值?

如果可能,我希望避免这样调用此应用程序:

1
C:\test> myapplication.exe"C:\\temp\\january\"

编辑:相反,如果可能的话,我更喜欢像这样调用应用程序

1
    C:\test> myapplication.exe @"C:\temp\january"

谢谢您。

编辑:

这实际上是用于调用SharePointWeb服务的控制台应用程序。我试过

1
2
3
4
5
6
7
8
9
10
11
12
13
  string SourceFileFullPath, SourceFileName, DestinationFolder, DestinationFullPath;

            //This part didn't work. Got Microsoft.SharePoint.SoapServer.SoapServerException
            //SourceFileFullPath = args[0]; // C:\temp\xyz.pdf
            //SourceFileName = args[1];     // xyz.pdf
            //DestinationFolder = args[2]; //"http://myserver/ClientX/Performance" Reports


            //This worked.  
            SourceFileFullPath = @"C:\temp\TestDoc2.txt";
            SourceFileName = @"TestDoc2.txt";
            DestinationFolder = @"http://myserver/ClientX/Performance Reports";
            DestinationFullPath = string.Format("{0}/{1}", DestinationFolder, SourceFileName);


如果字符串不是逐字字符串(以@开头的字符串),则需要在字符串内转义\是一个C特性。当您从控制台启动应用程序时,您不在C_之外,并且控制台不认为\是特殊字符,因此C:\test> myapplication.exe"C:\temp\january"可以工作。

编辑:我原来的帖子上面有"C:\temp\january\";但是,windows命令行似乎也把\作为转义符处理——但只有在"前面,这样命令才能将C:\temp\january"传递给应用程序。感谢@zimdanen指出这一点。

请注意,在C中引号之间的任何内容都是字符串的表示;实际字符串可能不同-例如,\\表示单个\。如果使用其他方法将字符串获取到程序中,例如命令行参数或从文件中读取,则字符串不需要遵循C的字符串文本规则。命令行有不同的表示规则,其中\表示自己。


"前缀"@"允许使用关键字作为标识符,这在与其他编程语言交互时很有用。字符@实际上不是标识符的一部分,因此在其他语言中,标识符可能被视为没有前缀的普通标识符。带有@前缀的标识符称为逐字标识符。对于不是关键字的标识符,允许使用@prefix,但在样式方面,强烈建议不要使用。"

  • 您可以将C的一个保留字与@符号一起使用。
  • EX:

    1
    2
      string @int ="senthil kumar";
        string @class ="MCA";

    2.使用文件路径时,在字符串之前

    1
    string filepath = @"D:\SENTHIL-DATA\myprofile.txt";

    而不是

    1
    string filepath ="D:\\SENTHIL-DATA\\myprofile.txt";
  • 对于多行文本

    string threeidiots=@"Senthil Kumar,诺顿斯坦利还有Pavan Rao!";

    1
    MessageBox.Show(ThreeIdiots);
  • 而不是

    1
    2
    string ThreeIdiots = @"Senthil Kumar,
       Norton Stanley,and Pavan Rao!"
    ;