我有一个bat文件,可以将文件从一个位置复制到另一个位置。
SET SRC=%1
SET DEST=%2
xcopy /Y/I %SRC%\*.txt %DEST%\temp
echo Done!
我正在尝试通过C#程序运行此文件
var psi = new ProcessStartInfo(fileToRun);
psi.Arguments = args;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
Process cmdProc = Process.Start(psi);
StreamReader output = cmdProc.StandardOutput;
StreamReader errors = cmdProc.StandardError;
cmdProc.WaitForExit();
执行了蝙蝠文件,我可以在输出中看到'完成!'消息,但不会复制文件。
唯一可行的方法是
psi.UseShellExecute = true;
psi.RedirectStandardOutput = false;
psi.RedirectStandardError = false;
但在这种情况下,我必须禁用输出/错误重定向,我需要它们。 所以这对我不起作用。
我试图设置管理员的用户名/密码
psi.UserName = username;
psi.Password = password;
登录成功,但我在StandardError流中收到'句柄无效'消息。
我想我正在尝试运行的进程没有复制文件的权限 我不知道如何授予他这些权限。
请帮忙!
EDITED
感谢您的回复! 我花了几个小时试图处理这个问题,因为它总是发生我发布了我的问题并找到了解决方案:)
为了避免“手柄无效”消息,您必须
psi.RedirectStandardInput = true;
但现在我可以看到cmd.exe窗口,如果设置了UserName,那就不好了。
答案 0 :(得分:1)
你错过了
psi.Domain = "domain";
psi.Verb ="runas";
//if you are using local user account then you need supply your machine name for domain
尝试这个简单的代码段应该适合你
void Main()
{
string batchFilePathName =@"drive:\folder\filename.bat";
ProcessStartInfo psi = new ProcessStartInfo(batchFilePathName);
psi.Arguments = "arg1 arg2";//if any
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.UseShellExecute = false;
psi.Verb ="runas";
psi.UserName = "UserName"; //domain\username
psi.Domain = "domain"; //domain\username
//if you are using local user account then you need supply your machine name for domain
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.UseShellExecute = false;
psi.Verb ="runas";
Process ps = new Process(psi);
Process.Start(ps);
}