2015-10-23 19 views
0

我有一個啓動「自定義操作」的C#代碼,通常是在機器上安裝/重新安裝Windows服務的.bat文件,但我的應用程序只知道此自定義操作可以使用Process.Start()啓動。自定義操作在我的應用程序將文件下載到用戶定義的文件夾時觸發。 這是我的文件夾結構:「新」包含新文件,「服務」包含用於運行Windows服務的文件。以管理員身份啓動批處理並保留在當前文件夾中

enter image description here

我的批處理文件看起來像這樣:

net stop DataExchangeProxyService 
installutil /u .\service\DataExchangeProxyService.exe 
copy .\new\*.* .\service 
installutil .\service\DataExchangeProxyService.exe 
net start DataExchangeProxyService 
PAUSE 

問題是當我開始從C#的過程與 「運行方式」 的動詞,那麼當前directoy爲「C:\ Windows \ System32下...「

Process process = new Process(); 
ProcessStartInfo startinfo = new ProcessStartInfo(); 
startinfo.FileName = Path.Combine(this.destinationFolder, customAction); 
startinfo.Verb = "runas";   
process.StartInfo = startinfo; 
process.Start(); 

這樣我的進程無法找到這些文件,因爲它沒有在目標文件夾中運行。批處理文件必須是這樣的,因爲它不能包含絕對路徑。如何使進程停留在當前目標文件夾中?

回答

0

另一種解決辦法是修改批處理文件來定位自己,改變這個文件夾,然後執行該過程的其餘部分

setlocal enableextensions disabledelayedexpansion 

    call :reinstall 
    pause 
    exit /b 

:reinstall 
    pushd "%~dp0" && (
     net stop DataExchangeProxyService 
     installutil /u .\service\DataExchangeProxyService.exe 
     copy .\new\*.* .\service 
     installutil .\service\DataExchangeProxyService.exe 
     net start DataExchangeProxyService 
     popd 
    ) 

哪裏%~dp0是包含批次的文件夾的驅動器和路徑文件。您可以使用此變量更改所有文件引用,這樣你使用絕對路徑,或者下面的代碼工作,改變當前Active Directory和使用相對路徑

如果你問爲什麼一個子程序,請閱讀In Batch file ~dp0 changes on changing directory

0

我覺得ProcessStartInfo.WorkingDirectory可能是你在找什麼

+0

我設置此屬性使用從startinfo.FileName和CMD窗口提取的值仍然顯示該批處理在「C:\ Windows \ System32 ...」中執行 – vpetrovic

0

我沒有所有的源代碼,所以我不能測試你,但我建議你保存的執行目錄,然後設置新的進程在那裏執行。 Windows可能仍會將您帶到新用戶的默認路徑,但您可以隨時進行調整以確保您在正確的時間位於正確的文件夾中。事情是這樣的:

 string savedDirectory = Directory.GetCurrentDirectory(); 
     Process process = new Process(); 
     ProcessStartInfo startinfo = new ProcessStartInfo(); 
     startinfo.FileName = Path.Combine(this.destinationFolder, customAction); 
     startinfo.Verb = "runas"; 
     startinfo.WorkingDirectory = savedDirectory; 
     process.StartInfo = startinfo; 
     process.Start(); 
1

把這個線非常接近你的蝙蝠文件的頂部(之前引用的任何文件/文件夾)

pushd "%~dp0" 

,將工作是否「以管理員身份運行」或沒有。

+0

這工作!謝謝!我不知道該命令是什麼,但是我在ProcessStartInfo中所做的更改在我將其添加到批處理文件中之前無法正常工作。 – vpetrovic

0

由於我還不能回覆,因爲我不是那麼長時間的用戶,但是你想知道pushd "%~dp0"是幹什麼的; pushd命令用於轉到文件夾,有點像cd,但也將該文件夾名保存到堆棧。隨着彈出,你可以稍後返回到頂部的堆棧項目。 %~dp0是執行當前bat文件的文件夾。 總之,此代碼用於返回到執行批處理文件的文件夾並將文件夾保存到堆棧。

相關問題