2014-04-11 5 views
1

Dummy.batпуть с пробелами в пакетном файле

set "EXECUTE_DIR=%2" 

echo %EXECUTE_DIR% 

на выполнение команды: Dummy.bat "para1" C:\Program Files\Microsoft SQL Server

я получаю выход как:

C:\Program 

но если я suround параметры в двойные кавычки : Dummy.bat "para1" "C:\Program Files\Microsoft SQL Server"

Я получаю желаемый результат как:

C:\Program Files\Microsoft SQL Server 

Я хочу, чтобы двойные кавычки были необязательными. Является ли это возможным?. Что я упускаю?

Заранее спасибо. Пожалуйста, помогите

+0

AFAIK в каждой утилите Microsoft, которая использует длинные имена файлов с пробелами, всегда цитируется. Утилиты сторонних разработчиков используют один и тот же метод - поэтому вам действительно нужно использовать стандартный способ получения параметров. – foxidrive

ответ

1

Вы можете удалить первый аргумент из списка аргументов, и поместить результат в строку:

@echo off 
set s1=%* 
set s2=%1 
set s3=%s1:* =% 
echo %s1% 
echo %s2% 
echo %s3% 

Выход:

c:\>Dummy.bat "para1" C:\Program Files\Microsoft SQL Server 
"para1" C:\Program Files\Microsoft SQL Server 
"para1" 
C:\Program Files\Microsoft SQL Server 
0

Как пространства разделители, если вы хотите использовать стандартную обработку аргументов и ссылаться на свой второй параметр как% 2, тогда нет возможности, кроме использования кавычек, чтобы заключить значение, содержащее пробелы.

Опция предназначена для управления аргументами кода. Определить, что в пакетный файл, все, что после некоторого числа параметров, в вашем случае ничего после первого параметра, будет обрабатываться как только один параметр, так что вы можете написать что-то вроде

@echo off 

    set "_2=" 
:loop 
    if defined _2 (set "_2=%_2% %2") else (set "_2=%2") 
    shift 
    if not "%~2"=="" goto :loop 

    echo %_2% 

это конкатенировать все параметры после первый в переменную, которую вы должны использовать insted аргумента %2.

0

Демо:

@ECHO OFF 
SETLOCAL 
set wholeline=%* 
set "parm1=%~1" 
set "parm2=%wholeline:* =%" 
CALL set "parm2a=%%wholeline:*%1 =%%" 
set parm 

GOTO :EOF 
0

Вы можете set счетчик и принять все после первого элемента (%1).

@echo off 
setlocal EnableDelayedExpansion 
set "$l=" 
set "$c=0" 
for %%a in (%*) do (
if !$c! geq 1 set $l=!$l! %%a 
set /a $c+=1 
) 
echo !$l:~1! 
Смежные вопросы