我想cmd从c#代码中运行一些命令.我跟着一些博客和教程得到了答案,但我有点困惑,即我应该如何传递多个参数?
我使用以下代码:
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
startInfo.FileName = "cmd.exe";
startInfo.Arguments =
...
Run Code Online (Sandbox Code Playgroud)
startInfo.Arguments以下命令行代码的值是多少?
makecert -sk server -sky exchange -pe -n CN=localhost -ir LocalMachine -is Root -ic MyCA.cer -sr LocalMachine -ss My MyAdHocTestCert.cer
netsh http add sslcert ipport=127.0.0.1:8085 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF} clientcertnegotiation=enable
我有以下字符串,我想将其作为一个进程执行:
Rundll32 Printui.dll,PrintUIEntry /ia /K /q /m "SHARP MX-5500N PS" /h "Windows NT x86" /v 3 /f sn0hwenu.inf
但是,如果存在引号,我无法在C#中插入此字符串以使其进行编译,从而保留所有原始结构.我该怎么解决这个问题?由于字符串中有引号,这有点棘手.
我正在尝试将命令行参数传递给C#应用程序,但我有问题传递这样的东西
"C:\Documents and Settings\All Users\Start Menu\Programs\App name"
Run Code Online (Sandbox Code Playgroud)
即使我加入" "了这个论点.
这是我的代码:
public ObjectModel(String[] args)
{
if (args.Length == 0) return; //no command line arg.
//System.Windows.Forms.MessageBox.Show(args.Length.ToString());
//System.Windows.Forms.MessageBox.Show(args[0]);
//System.Windows.Forms.MessageBox.Show(args[1]);
//System.Windows.Forms.MessageBox.Show(args[2]);
//System.Windows.Forms.MessageBox.Show(args[3]);
if (args.Length == 3)
{
try
{
RemoveInstalledFolder(args[0]);
RemoveUserAccount(args[1]);
RemoveShortCutFolder(args[2]);
RemoveRegistryEntry();
}
catch (Exception e)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我要传递的内容:
C:\WINDOWS\Uninstaller.exe "C:\Program Files\Application name\" "username" "C:\Documents and Settings\All Users\Start Menu\Programs\application name"
Run Code Online (Sandbox Code Playgroud)
问题是我可以正确地获得第一个和第二个args,但是它得到的最后一个args C:\Documents.
有帮助吗?
问题:给定文件名和任意字符串列表,是否有一种规范的方法来创建单个命令行,以便Environment.GetCommandLineArgs(和C#的void main(String[] args)/ VB Sub Main(args() As String))将返回相同的字符串列表?
背景:.NET将命令行拆分为参数的方式非常复杂,例如:
如果双引号跟随两个或偶数个反斜杠,则每个前进的反斜杠对将替换为一个反斜杠,并删除双引号.如果双引号跟随奇数个反斜杠(包括只有一个),则每个前一对用一个反斜杠替换,剩下的反斜杠被删除; 但是,在这种情况下,双引号不会被删除.
许多人尝试简单的"将每个参数放在双引号中并转义现有的双引号"方法,并且只要其中一个参数包含一个尾部反斜杠就会失败.有关此问题的StackOverflow存在各种问题,例如:
然而,他们的答案要么不够通用,不能为所有案例提供规范解决方案,要么似乎是"迭代地"开发("哦,还有一个我忘了的特殊情况,让我们添加它,现在它应该覆盖大多数情况...... ").由于这是一个非常常见的问题,我希望看到一个解决方案,例如,通过其中任何一个提供信心
要将带空格的路径传递给.NET控制台应用程序,您应该将其转义.可能没有逃脱,但用双引号括起来:
myapp.exe --path C:\Program Files\MyApp`
Run Code Online (Sandbox Code Playgroud)
变
new string[] { "--path", "C:\Program", "Files\MyApp" }
Run Code Online (Sandbox Code Playgroud)
但
myapp.exe --path "C:\Program Files\MyApp"
Run Code Online (Sandbox Code Playgroud)
变
new string[] { "--path", "C:\Program Files\MyApp" }
Run Code Online (Sandbox Code Playgroud)
它工作正常,你可以很容易地解析它.
我想扩展一个带有附加参数的参数集,并使用生成的参数集启动一个新进程:
new ProcessStartInfo(
Assembly.GetEntryAssembly().Location,
String.Join(" ", Enumerable.Concat(args, new[] { "--flag" })))
Run Code Online (Sandbox Code Playgroud)
这成为myapp.exe --path C:\Program Files\MyApp --flag路径逃脱的地方.
如何使用通用解决方案解决它?(不搜索每个参数的值,需要转义并手动引用)
如何将未知字符串转义为传递给Process.Start作为参数?
我目前正在逃避基本的引号和反斜杠,但最近我的输入开始包含http://www.fileformat.info/info/unicode/char/ff02/index.htm(全宽引号)等内容.
所以我的问题是,我需要逃避什么才能安全地传递一个字符串作为Process.Start的参数?
编辑: 所以我需要澄清一下.我真正想要的是一个必须在cmd.exe的带引号的字符串("foo")中转义的所有字符的列表.我最初处理双引号字符以及反斜杠字符,但我最终有一些输入包含一个全宽带引号(如上所述),它也需要转义.所以问题是,对于使用Process.Start传递给cmd.exe的带引号的字符串参数,我还需要转义什么?
我看过这个关于在C#中传递命令行参数的问题.
但在我的情况下,我必须将参数数组传递给调用.exe文件.
例如
var arr = new string[] {"Item title","New task","22","High Priority"}
Run Code Online (Sandbox Code Playgroud)
是否可以Process.Start()与exe路径一起使用数组
我有.exe路径
const string path = @"C:\Projects\Test\test.exe";
Run Code Online (Sandbox Code Playgroud)
谢谢
我有这个数组:
{
"AssemblyVersion":"0.1.333.5973",
"Exception":
{
// [...]
}
}
Run Code Online (Sandbox Code Playgroud)
它是从此类序列化的:
public class ErrorData
{
public string AssemblyVersion { get; private set; }
public Exception Exception { get; private set; }
public ErrorData(string assemblyVersion, Exception ex)
{
AssemblyVersion = assemblyVersion;
Exception = ex;
}
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
}
Run Code Online (Sandbox Code Playgroud)
将其序列化回对象会产生以下异常:
Newtonsoft.Json.JsonReaderException: Input string '0.1.335.5973' is not a valid number. Path 'AssemblyVersion', line 1, position 29.
at Newtonsoft.Json.JsonTextReader.ParseNumber(ReadType readType)
at Newtonsoft.Json.JsonTextReader.ReadStringValue(ReadType readType)
at Newtonsoft.Json.JsonTextReader.ReadAsString()
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract …Run Code Online (Sandbox Code Playgroud) 我使用以下代码启动另一个带有参数的进程,这里我传递一个字符串路径作为参数,路径返回为c:\ documents和settings \\ local settings ::
string path = Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)).FullName(); //path = c:\documents and settings\<username>\local settings
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.Arguments = path;
Process.Start(startInfo);
Run Code Online (Sandbox Code Playgroud)
我想把路径作为一个参数传递,一个完整的字符串.但我发现路径已被多个参数分隔,它实际上被每个空格分隔开.在这种情况下,它传递c:\ documents作为第一个参数,并作为第二个参数和 settings \\ local作为第三个参数传递...
我想将它们作为一个参数而不是4个参数传递.怎么办StartInfo.Argument呢?