我想使用 Process 类执行 command.exe 方法来返回父目录中的文件数。
它必须使用 command.exe(各种原因)。
这是我的代码:
private static Int64 GetFileCount(string path)
{
Int64 ct = 0;
Process process = new Process();
process.StartInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe");
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.Arguments = "dir \"" + path + "\" /s/a-d | find /c \".dat\"";
process.StartInfo.WorkingDirectory = path;
process.Start();
string output = process.StandardOutput.ReadToEnd();
if (output != "")
{
ct = Convert.ToInt64(output);
}
process.WaitForExit();
return ct;
}
路径变量是:
d:\Cloud\Catalogues\0\2015
我已经复制它并在 DOS 提示符下执行它并且它运行正常所以我知道 DOS 的东西是可以运行的。
这是我在 DOS/命令提示符中复制并运行的内容:
dir "d:\Cloud\Catalogues\0\2015" /s/a-d | find /c ".dat"
我已经在我的 C# 应用程序中使用了其他 DOS 命令并且一切运行良好。
结果始终是空字符串 {“”}。
我只是对这个‘查找’功能有疑问。
我知道我可以使用 bat 文件,但为了简单起见,我更愿意使用上面的文件。
我是否遗漏了什么?
答案1
编辑:实际问题似乎是您使用了错误的参数。当您想要执行在参数字符串中输入的命令时,请添加“/k”或“/c”。
旧的,可能仍然相关:假设你有非常好不使用System.IO命名空间以非黑客本机方式获取所需信息的原因是,我认为这是因为您尝试在没有ShellExecute的情况下运行,这意味着您必须提供您要执行的可执行文件的完整路径(在本例中为cmd.exe),因为该命令不是在shell中执行的,因此没有可用的环境变量来扩展cmd.exe的位置。
话虽如此,我还没有测试过,我使用的是 Linux,并且通常使用 Mono 进行开发。由于我的声誉不够,SuperUser 不会让我在没有完整答案的情况下发表我的意见,但我仍然觉得我应该发表我的意见。