我想知道是否有人可以帮助我理解为什么Process
无效,也不会产生错误。
下面的代码应循环遍历目录,查找扩展名为sqb
的所有文件,并为每个文件运行Process
作为在服务器上具有提升权限的用户帐户。
该进程应该从文件所在的同一文件夹中运行可执行文件sqb2mtf.exe
,例如sqb2mtf.exe file.sqb file.bak
这样的参数。
如果我使用Visual Studio 2013并逐步执行代码,我可以看到每个文件都已循环通过,Process
似乎触发,但没有文件被转换,也没有任何错误呈现给变量{{1} }。
readToEndError
我不在乎,任何解决这个问题的建议都会非常感激: - )
更新
var directory = new DirectoryInfo(@"D:\inetpub\Import\");
foreach (var file in directory .EnumerateFiles("*.sqb"))
{
var convert = Path.GetFileNameWithoutExtension(file.ToString());
var process = new Process
{
StartInfo =
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardInput = true,
RedirectStandardError = true,
FileName = @"D:\inetpub\Import\sqb2mtf.exe",
UserName = "myUserName",
Domain = "myDomain",
Password = GetSecureString("myPassword"),
Arguments = @"D:\inetpub\Import\" + file + " " + @"D:\inetpub\Import\" + convert + ".bak"
}
};
process.Start();
string readToEndOutput = process.StandardOutput.ReadToEnd();
string readToEndError = process.StandardError.ReadToEnd();
process.WaitForExit();
}
从var directoryInfo = new DirectoryInfo(BackupDirectory);
foreach (var file in directoryInfo.EnumerateFiles("*.sqb"))
{
var convert = Path.GetFileNameWithoutExtension(file.ToString());
var fileName = BackupDirectory + "sqb2mtf.exe";
var arguments = "\"" + BackupDirectory + file + "\" \"" + BackupDirectory + convert + ".bak\"";
var process = new Process
{
StartInfo =
{
CreateNoWindow = true,
UseShellExecute = true,
RedirectStandardOutput = false,
RedirectStandardInput = false,
RedirectStandardError = false,
FileName = fileName,
Arguments = arguments
}
};
process.Start();
process.WaitForExit();
file.Delete();
}
的评论中得出的一点是需要引号,在这种情况下需要引用两个单独的文件。
我可以确认此代码在IISExpress上运行,冒充不同的用户,遗憾的是只是IIS 7.5。
workround是将此代码移动到控制台应用程序中并安装在相关服务器上,然后使用Windows计划任务作为特定帐户运行。
答案 0 :(得分:1)
对于一些遗留应用程序,我发现我需要将参数作为引用文本传递,否则它们根本不起作用。
不确定这是否是问题,但值得尝试:
Arguments = "\"D:\\inetpub\\Import\\" + file + " D:\\inetpub\\Import\\" + convert + ".bak\"";
这个过程只会默默地死去,这似乎很奇怪。我会仔细检查Domain
,UserName
和Password
。