shreyassv Ответов: 2

Пакетный файл не работает при выполнении из кода C#


У меня есть пакетный скрипт, который отлично работает, когда я запускаю его из командной строки. но он не работает, когда я запускаю его из кода C#, хотя VS был в режиме администратора и процесс, который запускал this .bat, был повышен как администратор.


Process process = new Process();
                ProcessStartInfo psi = new ProcessStartInfo();
                psi.CreateNoWindow = true;
                psi.Verb = "runas";
                psi.FileName = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + batfile;
                psi.UseShellExecute = false;
                process.StartInfo = psi;
                process.Start();
                process.WaitForExit();


Что я уже пробовал:

Я попытался запустить этот процесс от имени администратора

2 Ответов

Рейтинг:
0

Jochen Arndt

System.IO.Path.GetDirectoryName возвращает путь без задней косой черты. Так что вы должны использовать

psi.FileName = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + @"\" + batfile;


Но обратите внимание, что существует исключение из этого правила, когда исполняемый файл находится в корневом каталоге. См. также пример выходных данных по адресу Метод Path. GetDirectoryName (String) (System.IO)[^].


Karthik_Mahalingam

5

shreyassv

Я попробовал это сделать,но ничего не вышло

NotPolitcallyCorrect

Используйте свой отладчик, чтобы выяснить, что означает "не работает".

shreyassv

его запуск bat-файла без + @ " \ " + и с+@"\"+, расположение bat является правильным. Но его неспособность выполнить шаги внутри пакетного скрипта. Но это работает, когда я щелкаю правой кнопкой мыши на bat-файле и запускаю его от имени администратора.
bat файл код ниже


@ECHO ПОЖАЛУЙСТА, НЕ ЗАКРЫВАЙТЕ ЭТО ОКНО
@ЭХО ********************************
@ECHO OFF

Пуск /ждем команды DISM /онлайн /включение функция параметр /FeatureName:ИИС-ApplicationDevelopment параметр /FeatureName:ИИС-АСП параметр /FeatureName:ИИС-Паш параметр /FeatureName:ИИС-обычную проверку подлинности параметр /FeatureName:ИИС-в CGI-параметр /FeatureName:ИИС-ClientCertificateMappingAuthentication параметр /FeatureName:ИИС-CommonHttpFeatures параметр /FeatureName:ИИС-CustomLogging параметр /FeatureName:ИИС-Документ_по_умолчанию параметр /FeatureName:ИИС-DigestAuthentication параметр /FeatureName:ИИС-DirectoryBrowsing параметр /FeatureName:ИИС-FTPExtensibility параметр /FeatureName:в IIS FTP-сервера параметр /FeatureName:службы IIS-FTPSvc

Jochen Arndt

Мне очень жаль, но "не работает" не может быть решена, потому что у меня нет доступа к вашей системе, чтобы увидеть, что происходит.

Все, что я могу предложить, это сделать несколько тестов, чтобы узнать, что не работает:
- Проверьте имя файла, наличие файла и разрешен ли доступ
- Используйте простой пакетный файл, который не требует прав администратора, чтобы проверить, возможно ли выполнение пакетных файлов таким образом (однако это должно быть)
- Используйте Процесс.Exitcode содержит
- Создайте окно оболочки, чтобы увидеть, что происходит (используйте операторы echo в пакетном файле)
- Если окно оболочки просто мигает (немедленно закрывается), попробуйте оставить его открытым (например, дождавшись нажатия клавиши в пакетном файле)

shreyassv

Спасибо. Я обнаружил проблему, моя программа вызывала 32-битный dism, но моя система имеет 64-битную операционную систему. поэтому я сделал несколько изменений, чтобы определить архитектуру системы и вызвать dism на ее основе

AkashDaniel

та же проблема и здесь
можете ли вы объяснить, как вы это делаете?

Рейтинг:
0

shreyassv

string system32Directory = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "system32", "dism.exe");
            if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
            {
                // For 32-bit processes on 64-bit systems, %windir%\system32 folder
                // can only be accessed by specifying %windir%\sysnative folder.
                system32Directory = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "sysnative", "dism.exe");
            }


определяет архитектуру системы и соответственно использует DISM