Je pense que vous trouverez que votre exemple fonctionne très bien comme il est.
cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out"
J'ai reproduit votre exemple ici
http://pastebin.com/raw.php?i=YtwQXTGN
C:\>cmd /c "c:\Program Files\my folder\my long program.exe" > "c:\temp\spaces are here\a.a"
C:\>type "c:\temp\spaces are here\a.a"
my long program.exe has run
C:\>
further example demonstrating it works with "my long program.exe", removing cmd /c, it operates fine too.
C:\>"c:\Program Files\my folder\my long program.exe" > "c:\temp\spaces are here\
a.a"
C:\>type "c:\temp\spaces are here\a.a"
my long program.exe has run
C:\>
Another example, but with replace. replace with no parameters says "source path required" "no files replaced"
C:\>replace > a.a
Source path required
C:\>type a.a
No files replaced
Exactly the same effect when they're in folders with spaces.
C:\>cmd /c "c:\Program Files\my folder\replace.exe" > "c:\temp\spaces are here\r.r"
Source path required
C:\>type "c:\temp\spaces are here\r.r"
No files replaced
C:\>
further demonstration with replace
without cmd /c works fine too.
C:\>"c:\Program Files\my folder\replace.exe" > "c:\temp\spaces are here\r.r"
Source path required
C:\>type "c:\temp\spaces are here\r.r"
No files replaced
C:\>
La raison pour laquelle votre exemple fonctionne très bien
cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out"
et comment/pourquoi il fonctionne de la manière qu'il le fait, c'est parce que l' > est interprété comme étant spécial par l'host.exe Donc, cette partie - cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe"
- je pense - est évalué en premier. c'est à dire cmd /c ne pas voir l' > et après.
cmd /? montre 2 cas
Le cas 1 et le Cas 2. Votre exemple s'adapte Cas 1
If /C or /K is specified, then the remainder of the command line after
the switch is processed as a command line, where the following logic is
used to process quote (") characters:
1. If all of the following conditions are met, then quote characters
on the command line are preserved:
- no /S switch
- exactly two quote characters
- no special characters between the two quote characters,
where special is one of: &<>()@^|
- there are one or more whitespace characters between the
two quote characters
- the string between the two quote characters is the name
of an executable file.
2. Otherwise, old behavior is to see if the first character is
a quote character and if so, strip the leading character and
remove the last quote character on the command line, preserving
any text after the last quote character.
Vous pouvez tester pour vous assurer que votre exemple s'adapte cas 1, parce que si vous ajoutez /s (sans ajout de plus de citations ou de faire tout changement à tous pour votre exemple autre que l'ajout /s), puis vous obtenez un résultat différent, car il rend votre exemple de cas 2. Donc cela prouve bien que votre exemple est certainement un cas 1. Et, de toute évidence répond à tous les critères du cas 1.
Si votre exemple était un cas 2, et vous avez ajouté /s, alors il ferait aucune différence.
Votre réponse est intéressante car elle montre une autre façon d'obtenir votre résultat, mais dans le cas 2. En ajoutant d'autres outter guillemets et en ajoutant /s.
Mais en fait, lorsque vous ajoutez ces outter citations, alors vous avez juste fait un cas 2, et l'ajout d'un /s sur le dessus de cela ne fera pas une différence.
C:\>cmd /c "c:\Program Files\my folder\replace.exe"
Source path required
No files replaced
C:\>cmd /s /c "c:\Program Files\my folder\replace.exe"
'c:\Program' is not recognized as an internal or external command,
operable program or batch file.
C:\>cmd /c ""c:\Program Files\my folder\replace.exe""
Source path required
No files replaced
C:\>cmd /s /c ""c:\Program Files\my folder\replace.exe""
Source path required
No files replaced
C:\>
L'exemple dans votre question a bien fonctionné
cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out"
Votre alternative (avec le /S et à l'extérieur des guillemets), vous donnez une réponse pour prendre l'exemple du travail, fonctionne très bien aussi
cmd.exe /S /C ""C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out""
Si votre réponse, qui est une alternative, peut effectivement être simplifié par la suppression de l' /S parce que c'est déjà le cas 2, l'ajout d' /s ne fera aucune différence. Donc, ce qui permettrait d'améliorer la solution donnée dans votre réponse
cmd.exe /C ""C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out""
Votre exemple que vous avez décrit comme un problème dans votre question, et votre solution, de produire le même résultat. Mais une grande différence, je suppose, (et je ne suis pas sûr de la façon de tester pour cela), mais une différence dans la façon dont votre exemple fonctionne, et la façon dont la solution dans votre réponse œuvres, c'est que je pense que dans le cas de votre exemple, l'hébergement/invoquant cmd.exe ne le rediriger vers le fichier. Alors que dans votre solution de l'exemple, le invoquée cmd.exe est passé à l' > par l'hôte cmd.exe et donc, la invoquée cmd.exe la redirection. Bien sûr également, votre exemple est un cas 1, tandis que votre solution est un amendement que vous avez effectuées (très bien) pour le faire fonctionner dans le cas 2.
J'espère que je n'ai pas commis une erreur ici, j'ai peut-être. Mais votre question et la réponse m'a aidé à envelopper ma tête autour de la façon dont cmd et en particulier cmd /c est le travail!
Peut-être que votre exemple est une simplification de votre actuel, et votre réel sur un échec et besoin de votre amendement. Si votre cas par exemple, avait été un tout petit peu plus complexe, par exemple, en ayant un paramètre pour le programme qui a pris citations, puis il avais Cas d'échec 1, et on aurait bien besoin d'outter citations (/S ne changera pas le résultat, donc pas de /S serait nécessaire, comme il l'avait déjà être le cas n ° 2 une fois que vous ajoutez ceux nécessaires extérieur des guillemets). Mais l'exemple que vous avez donné dans votre question me semble bien fonctionner.
Ajouté - Un associé Q et qu'est-Ce que " cmd /s` pour?