2010-12-13 71 views
3

J'ai un léger problème avec les chaînes Powershell. Il existe un programme Java que j'utilise, appelé SymmetricDS, qui accepte les arguments d'un fichier de commandes Windows pour certaines fonctions administratives. L'un d'entre eux est d'ouvrir l'enregistrement d'un noeud, en passant une chaîne contenant le groupe du nœud et id:Arguments de ligne de commande d'un exe

& .\bin\sym.bat -p symmetric.properties --open-registration 'store,01' 

Dans le fichier batch, java est appelé, avec des propriétés je suis passé au-dessus d'être passé dans comme ceci:

java -Dthis -Dthat -Dfoo -Dbar %1 %2 %3 %4 %5 %6 %7 %8 %9 

la fonction dans la java s'échoue après cette partie:

int index = argument.trim().indexOf(","); 
if (index < 0) { 
    throw new SymmetricException("LauncherMissingFilenameTriggerSQL", OPTION_OPEN_REGISTRATION); 
} 

index est apparemment -1. Pourquoi il ne trouve pas le caractère virgule, je ne sais pas. Je sais juste que quand je lance le même dans un fichier .cmd ou .bat, il fonctionne très bien:

.\bin\sym.bat -p symmetric.properties --open-registration "store,01" 

Je soupçonne qu'il a quelque chose à voir avec la chaîne de Powershell étant Unicode, et quelque chose d'inconvenant qui se passe dans leur voyage de là dans un fichier batch, puis dans Java.

Quelqu'un sait comment je peux appeler cela directement dans Powershell?

Résolue: zdan's answer œuvres, tout comme trompant Powershell un peu comme ceci:

.\bin\sym.bat -p symmetric.properties --open-registration '"store,01"' 

Répondre

4

Ce n'est pas une question unicode. Tu as trébuché contre l'analyseur de Powerhell. Lorsque vous appelez l'opérateur d'appel, powershell analyse le reste de vos arguments et les transmet ensuite au script que vous appelez. Les guillemets simples autour de la chaîne 'store, 01' sont effectivement supprimés et sont interprétés comme une liste étendue en deux arguments distincts.

Il suffit de lancer cmd.exe directement, en citant soigneusement votre chaîne de commande:

cmd.exe /c ' .\sym.bat -p symmetric.properties --open-registration "store,01" ' 

Notez que vous devez passer la commande à cmd.exe comme une seule chaîne, sinon il sera analysé par Powershell.

+0

Intéressant. Même sans l'opérateur d'appel (comme dans votre premier exemple), '' store, 01'' est encore élargi en 2 éléments au lieu de rester 1. J'ai réussi à le tromper avec ''" store, 01 "'' de sorte qu'il ne dépouille que les apostrophes externes. Je suppose que j'ai besoin d'en savoir plus sur l'analyseur pour éviter d'autres bizarreries, car l'écriture de scripts pour m'aider à contrôler d'autres applications est mon utilisation principale de PowerShell. –

+0

@Joel Vous avez raison, il suffit de supprimer l'opérateur d'appel n'aide pas, j'ai enlevé cela. – zdan