我正在尝试从 C# 代码运行 7z 以提取一些文件。该命令在 Windows 下工作,或者如果我直接从 shell 运行它,而不是从代码运行它。也许它不完全一样,我没有意识到。
所以我这样做:
//Unpack dump with 7z
StringBuilder argument = new($"\"{Config.zipPath}\" x \"{dumpPath}\" -so | \"{Config.zipPath}\" x -y -si -ttar");
foreach (string file in new[] { "vn", "vn_titles" /* and other strings */ }) {
argument.Append($" db/{file} db/{file}.header");
}
Process.Start(Config.shell, string.Format(Config.arguments, argument)).WaitForExit();
配置文件是加载到静态
Config
类中的键=值对列表。所以,它适用于 Windows:
shell=cmd.exe
zipPath=C:/Program Files/7-Zip-Zstandard/7z.exe
arguments=/C "{0}"
但不适用于 Linux:
shell=ash
zipPath=7z
arguments=-c '{0}'
那里的 ash 命令失败并出现错误:
x: line 0: syntax error: unterminated quoted string
Config.shell
是ash
string.Format(Config.arguments, argument)
是-c '"7z" x "dump.tar.zst" -so | "7z" x -y -si -ttar db/vn db/vn.header db/vn_titles db/vn_titles.header db/releases db/releases.header db/releases_titles db/releases_titles.header db/releases_vn db/releases_vn.header db/vn_length_votes db/vn_length_votes.header db/tags db/tags.header db/tags_parents db/tags_parents.header db/tags_vn db/tags_vn.header'
ash -c '"7z" x "dump.tar.zst" -so | "7z" x ... '
,并且该命令手动运行,按预期工作。所以我真的很难弄清楚问题出在哪里。-c '...'
必须恰好是两个参数(-c
和引号内的任何内容)。我不确定 Process.Start(string, string)
重载如何将第二个参数拆分为命令行参数,但从你的问题来看,它似乎并没有像一个(或你的 shell)所期望的那样拆分它们:)
Start(string, IEnumerable<string>)
:
Process.Start(Config.shell, new[]{ "-c", argument })