Apri il file txt dall’applicazione C #

Il seguente codice suppone di aprire CMD dalla mia applicazione C # e di aprire il file text.txt.

Ho provato a impostare il percorso del file come una variabile di ambiente, ma quando si apre il blocco note cerca% file% .txt anziché text.txt

Qualche idea del perché?

System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.EnableRaisingEvents=false; proc.StartInfo.EnvironmentVariables.Add("file", "c:\\text.txt"); proc.StartInfo.UseShellExecute = false; proc.StartInfo.FileName = "notepad"; proc.StartInfo.Arguments="%file%"; proc.Start(); proc.WaitForExit(); Console.WriteLine(proc.ExitCode); 

    Se il tuo scopo è avviare l’editor con un file .txt (come dice il titolo della domanda) usa semplicemente:

     Process.Start("C:\\text.txt") 

    La versione breve è che sospetto che dovrai passare l’argomento più direttamente, ad es

      proc.StartInfo.Arguments = @"""c:\text.txt"""; 

    Sebbene sia ansible impostare variabili di ambiente (da utilizzare all’interno del processo), non penso che sia ansible utilizzarle durante l’avvio del processo.

    Cosa stai cercando di ottenere con% file%? L’argomento della riga di comando per notepad.exe è il file che si desidera aprire. Devi fare qualcosa del genere:

     proc.StartInfo.Arguments = "c:\\text.txt"; 

    imposta UseShellExecute = true

    in questo modo dovrebbe utilizzare il processore cmd.exe per espandere la variabile% file%

    Un problema ovvio è che hai impostato UseShellExecute false. Ciò significa che stai eseguendo il blocco note direttamente senza passare attraverso la shell dei comandi cmd.exe. Pertanto le variabili di ambiente non vengono ampliate.

    Non sono sicuro di cosa stai cercando di ottenere (perché hai bisogno di aggiungere una variabile d’ambiente?) Ma il seguente potrebbe funzionare:

      System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.EnableRaisingEvents = false; proc.StartInfo.EnvironmentVariables.Add("file", "c:\\text.txt"); proc.StartInfo.UseShellExecute = false; proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.Arguments = "/c notepad %file%"; proc.Start(); proc.WaitForExit(); 

    Prova questo:

     proc.StartInfo.Arguments = System.Environment.GetEnvironmentVariable("file"); 

    Forse ha a che fare con il funzionamento di StartInfo.Arguments. Se non riesci a trovare qualcosa di meglio, questo ha funzionato per me:

     proc.StartInfo.FileName = "cmd"; proc.StartInfo.Arguments="/c notepad %my_file%"; 

    Sono disposto a scommettere che è necessario impostare WorkingDirectory per farlo funzionare. NOTEPAD.exe si trova in genere in % SYSTEMROOT% (C: \ windows), tuttavia il valore predefinito è % SYSTEMROOT% \ system32 . Prova il seguente

     System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.EnableRaisingEvents=false; proc.StartInfo.WorkingDirectory = "%SYSTEMROOT%"; proc.StartInfo.EnvironmentVariables.Add("file", "c:\\text.txt"); proc.StartInfo.UseShellExecute = false; proc.StartInfo.FileName = "notepad"; proc.StartInfo.Arguments="%file%"; proc.Start(); proc.WaitForExit(); Console.WriteLine(proc.ExitCode);