2016-07-14 1 views
0

я написал программу под названием «CopyFile», чтобы скопировать файл из локальной в сетевой папке общий раз, как показано ниже:C#: Разница между выполнением программы напрямую и позвонить другим процессом

List<string> log = new List<string>(); 
string originPath = "*LOCAL PATH*"; 
string targetPath = "*TARGET PATH*"; 

System.Diagnostics.Process p = new System.Diagnostics.Process(); 
p.StartInfo.FileName = "cmd.exe"; 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardInput = true; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.CreateNoWindow = true; 

if (File.Exists(originPath)) 
{ 
    p.Start(); 
    StreamWriter sw = p.StandardInput; 
    sw.WriteLine(@"NET USE *TARGET IP* *PASSWORD* /USER:*USERNAME*"); 
    sw.WriteLine(@"COPY "+'"'+originPath+'"'+ " "+'"'+targetPath+'"'); 
    sw.WriteLine("Y"); 
    sw.WriteLine("EXIT"); 
    sw.Close();     
    p.WaitForExit(); 

    log.Add(p.StandardOutput.ReadToEnd()); 
} 
else 
{     
    log.Add("No file"); 
} 

Я попытался эту программу на моем компьютере, если я запустил эту программу, дважды щелкнув по ней успешно выполненную программу. Но если я использую другую программу C# или планировщик задач Windows для вызова и ее выполнения. Программа не может работать нормально. Я проверил файл журнала, чтобы увидеть результат. Журнал двойного щелчка и выполнить его показывает:

D:\Downtime>NET USE *TARGET IP* *PASSWORD* /USER:*USERNAME* 
The command complete successfully. 
D:\Downtime>COPY *originpath* *targetpath* 
1 file(s) copied. 
D:\Downtime>EXIT 

Но если я использую другие C# программы или окно планировщик задач для его выполнения, журнал показывает

C:\Windows\system32>NET USE *TARGET IP* *PASSWORD* /USER:*USERNAME* 

C:\Windows\system32>COPY *originpath* *targetpath* 
0 file(s) copied. 

C:\Windows\system32>EXIT 

Похоже, если я называю его другим программа или планировщик задач Windows, «cmd.exe» не выполнит команду «NET USE», поэтому я не могу подключиться к сетевому компьютеру и скопировать файлы на него. Кто-нибудь знает, в чем проблема? Благодарю.

+0

Диски отображаются на токене пользователя. У админов есть два AsAdmin и Limited. Однако вам не нужно ничего делать. 'copy '\\ servername \ sharename \ folder \ file.ext" "\\ servername \ sharename \ folder \ file.ext" '. Сопоставление дисков - это совместимость для программ pre windows 95, которые люди не переставали использовать. –

+0

Скорее всего, сообщение об ошибке, генерируемое командой «NET USE», записывается в «StandardError». Вы также должны будете захватить этот вывод, если хотите посмотреть, что он говорит. –

ответ

0

Я не знаю, что вы путь - это абсолютный путь или относительный путь. Если вы используете относительный путь в своем коде, вам следует рассмотреть возможность установки свойства WorkDirectory экземпляра ProcessStartInfo.

Когда вы вызываете вашу программу напрямую. WorkDirectory - это каталог, содержащий исполняемый файл.

Когда вы вызываете свою программу из другого процесса, рабочий каталог является каталогом другого процесса, а не вашей программы.

Таким образом, в этом случае вы должны правильно установить свойство WorkDirectory.

Подробнее на here.

+0

Спасибо, я добавляю WorkDirectory в свою программу, и он работает. –