Ist es möglich, ein Karat (^) aus einer Variablen in Anführungszeichen zu entfernen?

0

Ich habe eine Batch-Datei eingerichtet, die einen SQL-Befehl verwendet, der an eine Befehlsdatei übergeben wird. Wenn ich diese Variable aufrufe, wird die Zeile jedoch nicht angezeigt. Ich erhalte die Fehlermeldung "SQL-Befehl nicht erkannt".

In meiner Datei mache ich so etwas:

ECHO OFF
set vSQL=%~2

echo %vSQL%

Das SQL - Variable I in die Datei am Übergang enthält eine weniger als Betrieb: select * from sometable where c3 < 999999999.

Ich habe versucht, das ^zu diesem hinzuzufügen ...c3 ^< 999999999, aber das hat immer noch nicht funktioniert. Ich bekomme den gleichen Fehler. Gibt es eine andere Möglichkeit, <eine Batch-Datei zu verwenden?

Und ja, ich bin sicher, dass es der Teil der Datei ist, der das Problem verursacht. Ich habe die gesamte SQL-Operation in sqldeveloper ausgeführt, wo sie einwandfrei funktioniert hat.

Robert
quelle
Ich bin mir ziemlich sicher, dass dies ein Operator ist, der "weniger als" ist, mein Freund. Laut dieser Seite sollte ein "<" -Zeichen zwischen Anführungszeichen entweder unverändert funktionieren oder mit einem Karat maskiert werden, wie Sie es getan haben ... Sind Sie sich sicher, dass es das "<" ist, das die Probleme verursacht? Haben Sie die SQL an einer anderen Stelle ausgeführt, um zu überprüfen, ob sie korrekt ist? Ich schieße hier irgendwie auf Ihr Problem, aber haben Sie es mit einer Doppelkarat-Fluchtsequenz versucht?
Bosco

Antworten:

0

Der Batch-Parser verwendet Folgendes, um Parameter zu begrenzen: <space> <tab> ; , = <0xFF>Das letzte Zeichen ist ein nicht unterbrechendes Leerzeichen.

Es ist unmöglich, die Parameterbegrenzer in der Befehlszeile zu umgehen. Die einzige Möglichkeit, ein Trennzeichen in einen Parameterwert aufzunehmen, besteht darin, den gesamten Parameter in doppelte Anführungszeichen zu setzen.

So können Sie Ihr Skript aufrufen mit: yourScript.bat "select * from sometable where c3 < 999999999". Da die <jetzt zitiert ist, müssen Sie sich keine Sorgen mehr machen, dass Sie nicht entkommen.

Die Anführungszeichen gelten als Teil des Wertes. Wenn Sie den ~Modifikator in verwenden, %~2werden die umgebenden Anführungszeichen aus dem Parameterwert entfernt. Aber jetzt musst du dir Sorgen machen, ob du das Requotieren oder Entkommen willst <. Das einfachste , was zu tun ist Anführungszeichen Ausdruck um den gesamten Zuordnung hinzuzufügen: set "vSQL=%~2". Auf diese Weise schützen die Anführungszeichen <den Wert, sind jedoch nicht im Wert enthalten.

Wenn es an der Zeit ist, die Variable zu verwenden, müssen Sie sich erneut um den <Charakter kümmern . In diesem Fall ist es am einfachsten, die verzögerte Erweiterung zu aktivieren und zu verwenden.

setlocal enableDelayedExpansion
echo !vSQL!
dbenham
quelle
0x255 That last character is a non-breaking space. Ich nehme an, du meintest 0xffda 0x255eigentlich ɕ(Latin Small C With Curl). Trotzdem ist es kein wirklich ununterbrochener Raum. Das echte NBSP befindet sich am Unicode-Code-Punkt 0xa0. Das Zeichen an 0xff ist Code-Seite abhängig und könnte sein ے, ˙, яetc., ist aber oft ÿ. Es wird manchmal als "Non-Break-Space" bezeichnet, weil es in den alten DOS-Zeiten von vielen (aber nicht allen) Programmen als Leerzeichen angezeigt , aber (in gewisser Weise) wie ein normales Zeichen behandelt wurde, aber selbst dann war es eine Codepage abhängig.
Synetech
@Synetech - Doh! Ja, ich meinte 0xFF (fest), und ja, die tatsächliche Bedeutung ist abhängig von der Codepage. Ich bin mir jedoch ziemlich sicher, dass dieses Zeichen als Trennzeichen ausgewählt wurde, da es ein nicht unterbrechendes Leerzeichen in der Codepage ist, die von den ursprünglichen Entwicklern der CMD-Sprache verwendet wird. Aber ja, Sie haben in jeder Hinsicht Recht.
Dbenham
Ich habe es in einer Windows-Eingabeaufforderung versucht, und der Befehlsinterpreter verwendet es tatsächlich als Argumenttrennzeichen (ich weiß nicht, ob DOS dies tut; ich muss es am Samstag versuchen). Es ist interessant, weil ich viele alte DOS-Batch-Dateien habe, die 0xff (ab) für verschiedene Zwecke (wie das Formatieren von Tabellen) verwendet haben und später, wenn ich sie in Windows verwende, als angezeigt werden ÿ. Ich muss prüfen, ob ich es jemals in Argumenten verwendet habe, da es in Windows kaputt gehen würde. Ich frage mich auch, wie CMD damit umgeht, wenn Sie eine Codepage verwenden, in der es kein Leerzeichen gibt (ich chcp
möchte
@Synetech - Ich bin mir ziemlich sicher, dass CMD 0xFF als Parameterbegrenzer unabhängig von der Codepage interpretiert. Ich glaube, ich habe vor langer Zeit einige Tests durchgeführt, aber mein Gedächtnis ist nicht perfekt.
Dbenham
Klingt vernünftig. Ich habe ein paar ausprobiert und konnte keine finden, die etwas anderes als ein Leerzeichen anzeigt. Sie haben wahrscheinlich recht mit CMD und diese Seite , die ich vor ein paar Jahren gelesen habe, scheint sie zu stützen. Ich werde DOS am Wochenende einen Wirbel geben, um zu sehen, was passiert, aber es sieht so aus, als ob es auch das sogenannte "unsichtbare Zeichen" in allen DOS-Codeseiten ist ( charmapnennt es no-break space).
Synetech