2011-06-24 12 views
13

To jest problem mam:Batch File: FOR/F nie działa, jeśli ścieżka zawiera spacje

@ECHO OFF 

REM If this batch file is run in the same directory as "command.exe" then the 
REM following line will work. 
FOR /F "usebackq" %%A IN (`command.exe "C:\File Being Passed as a Parameter.txt"`) DO ECHO %%A 

REM The following line does not work no matter where this batch file is run. 
FOR /F "usebackq" %%A IN (`"C:\Folder With Spaces\command.exe" "C:\File Being Passed as a Parameter.txt"`) DO ECHO %%A 

chciałbym zapisać ten plik wsadowy, gdzie chcę, a nie być zmuszony do sklepu w tym samym folderze, co plik command.exe. Jakieś sugestie?

Odpowiedz

23

Dodaj CALL przed nazwą programu:

FOR /F "usebackq" %%A IN (`CALL "C:\Folder With Spaces\command.exe" "C:\File Being Passed as a Parameter.txt"`) DO ECHO %%A 
+1

Dlaczego użycie 'call' z EXE? – jeb

+4

@jeb: W tym konkretnym przypadku, aby obejść problem, o którym mowa. –

+0

Masz rację, przetestowałem to i wygląda na to, że działa tylko z "call" – jeb

11

call trick Andriy M jest mądry i działa dobrze, ale starałem się zrozumieć problem tutaj.

Ten problem jest spowodowany przez cmd.exe, jak można przeczytać na cmd /help

....
pierwszy i ostatni cytat zostanie usunięty, gdy istnieją nie dokładnie dwa cytaty w linia.
...

Tak jest też inne rozwiązanie z po prostu dodanie dwóch dodatkowych cytatów

FOR /F "usebackq=" %%A IN (`""C:\Folder Space\myCmd.exe" "Param space""`) DO (
    ECHO %%A 
) 
+0

To jest dokładnie w porządku! Wystarczy dodać kilka przykładów tutaj. Działa to: 'FOR/F" usebackq "% A IN (\' cmd.exe/C "findstr.exe" /? \ ') DO @ECHO% A' (cytuje tylko około * jeden * argument). To też działa: 'FOR/F" usebackq "% A IN (\" "cmd.exe"/C findstr.exe /? \ ') DO @ECHO% A' (cytuje * tylko * wokół polecenia). Czyni to * nie * działa dopóki kolejna para podwójnych cudzysłowów nie zostanie dodana, tak jak zasugerowałeś: 'FOR/F" usebackq "% A IN (\" "cmd.exe"/C "findstr.exe" /? \ ') DO @ECHO% a'. –

+1

USEBACKQ nie jest potrzebny i lepiej używać ''^" "c: \ folder \ dyskodbiorcy \ myCmd.exe" "param z^trucizną char"^"'', więc trucizny znaków są nadal cytowane poprawnie. – dbenham

0

ostrożny:

Korzystanie 'Call' (jak pokazano przez Andrij M) wydaje się najbezpieczniejszą opcją.

Znalazłem przypadek, w którym dodanie początkowych i końcowych podwójnych cudzysłowów (sugerowanych jako możliwe rozwiązanie przez jeb) ma problem.

Problem:

for /f "delims=" %%i in ('""C:\path with spaces\hello.bat" "filename with an & ampersand.jpg""') do (echo output=%%i)

wyjście cmd.exe w: & was unexpected at this time.

Rozwiązanie:

for /f "delims=" %%i in ('call "C:\path with spaces\hello.bat" "filename with an & ampersand.jpg"') do (echo output=%%i)

Powiązane problemy