Parameter an ein Batch übergeben

30/09/2008 - 16:19 von andi rickenbach | Report spam
Hallo

Von meiner c# Applikation aus rufe ich ein Batchfile auf. Dies etwa so:

Process process = StartProcess("RestoreTable.cmd", m_strFolder);

Wenn der Übergabeparameter m_strFolder ein Leerzeichen enthàlt wie z.B.
C:\Program Files, wird dies im Batchfile als zwei Argumente erkannt (eines
C:\Program und das andere Files).

Ich habe nun "\"" vor und nach dem m_strFolder angehàngt:

Process process = StartProcess("RestoreTable.cmd", "\"" + m_strFolder + "\"");

und so würde das auch funktionieren, bzw. ich musste dann im Batchfile die
zusàtzlichen Hochkommas mit
set path=%1
set path=%path:~1,-1%
wieder entfernen, sonst kommt das Batchfile mit diesen zusàtzlichen
Hochkommas nicht zurecht wie z.B. if not exist %1 ... .

Eigentlich würde das so funktionieren, aber die Applikation arbeitet mit
sehr vielen solchen Batchaufrufen und dies würde extrem viel arbeit geben.

Gibt es da ev. nicht eine andere Möglichkeit? Frage ist eigentlich wie
bekomme ich einen Pfad mit Leerzeichen von c# in das Batchfile, ohne das die
Leerzeichen als separate Parameter erkannt werden.

Vielen Dank.
 

Lesen sie die antworten

#1 Frank Dzaebel
30/09/2008 - 21:21 | Warnen spam
Hallo Andi,

Process process = StartProcess("RestoreTable.cmd", m_strFolder);
Wenn der Übergabeparameter m_strFolder ein Leerzeichen enthàlt wie
z.B. C:\Program Files, wird dies im Batchfile als zwei Argumente
erkannt (eines C:\Program und das andere Files).



ggf. könnte die Benutzung von 8.3-Pfaden helfen, da
diese immer nur einen Parameter in DOS-Calls darstellen.
Zudem verringert sich die potentielle Überschreitung
der maximal zulàssigen Zeichen in einem cmd-Call:


public partial class Form1 : Form
{
public Form1() { InitializeComponent(); }

private void Form1_Load(object sender, EventArgs e)
{
string shortPath = FileIO.GetShortPath(Application.StartupPath);
MessageBox.Show(shortPath);
}
}

public static class FileIO
{
/// <summary>Retrieves the short path form of the
/// specified path.</summary>
/// <remarks>
/// [GetShortPathName Function (Windows)]
/// http://msdn.microsoft.com/en-us/lib...64989.aspx
/// </remarks>
public static string GetShortPath(string longPath)
{
const int MAX_PATH = 260;
const int GetShortPathNameFAILS = 0;
StringBuilder shortPathBuffer = new StringBuilder(MAX_PATH);
if (NativeMethods.GetShortPathName(longPath, shortPathBuffer,
(uint)shortPathBuffer.Capacity) == GetShortPathNameFAILS)
throw new Win32Exception();

return shortPathBuffer.ToString();
}
}

/// <summary>API Aufrufe</summary>
internal static class NativeMethods
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto,
SetLastError = true, BestFitMapping = false,
ThrowOnUnmappableChar = true)]
public static extern uint GetShortPathName(
[In] string lpszLongPath,
[Out] StringBuilder lpszShortPath,
[In] uint cchBuffer);
}


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen