Неверный параметр% 1, если файл или папка с & (амперсандом) или ^ (кареткой) и без пробела в полном имени не помещены в командный файл - PullRequest
0 голосов
/ 30 марта 2020

Есть ли решение для: The %1 parameter is incorrect когда файл или папка с & (амперсанд) или ^ (каретка) и без пробела в полном имени не добавлены в командный файл?

1 Ответ

0 голосов
/ 30 марта 2020

После того, как я сам столкнулся с этой проблемой, я выкладываю решение для обзора и возвращаю все, что я узнал от ss64.com и stackoverflow.com - Спасибо!

Из моего тестирования, прилагаемого пакетный файл работает для всех, кроме ограничения символов в командной строке.

Решение для & и ^:

Относительно параметра% 1: отбрасывания с пробелами в них работоспособны, потому что пробел автоматически вызывает окружение double кавычки, которые экранируют все специальные символы в этой строке в кавычках. Для амперсандов и переносов требуется тот же процесс, который получают пробелы, но этот процесс для них не вызывается.

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

В равной степени важен обходной путь, контроль и предсказуемость двойных кавычек: Хотя обходной путь прост, реализация и эффекты двойных кавычек должны быть Понятно, чтобы они не вызывали ошибок во всем командном файле. Одна пара окружающих двойных кавычек экранирует все специальные символы в этой строке в кавычках. Две пары окружающих двойных кавычек функционально совпадают с отсутствием двойных кавычек, что приводит к тому, что ничего не экранируется, и любые специальные символы остаются активными (пакетные файлы не имеют левой или правой кавычки - открытая цитата закрывается следующая следующая неназначенная кавычка).

По возможности избегайте двойных кавычек, встроенных в параметры и переменные. Отмените встроенные двойные кавычки с помощью «% ~ 1» или удалите их, используя set «var =% var:» =% «Если в этом нет необходимости, используйте set« var = value »вместо set var =« value »

В прилагаемом пакетном файле защитные двойные кавычки: Внутренние в! Params! Во время предварительной обработки, Используются для команды For, Сохраняются внешние для "% _Dropped%" во время обработки

Эта работа основана на и с благодарностью признана стратегия и код Джеба по адресу: https://ss64.org/viewtopic.php?id=1168 «файл перетаскивания, названный с проблемой амперсанда» - 13 января 2011 г. 15:07 Кроме того, спасибо всем вам за ваши хорошо заданные вопросы за годы до того, как они у меня были.

PS Я написал здесь то, что мне нужно было знать до того, как это началось.

Примечание: (могут быть и другие варианты использования) эхо одного di git в текстовый файл не получалось до тех пор, пока ( ), попробуйте: echo 9 >> con & (echo 9) >> con

::  Code ...   Stable_Params.bat

@prompt $g 
@if "%~1"=="" echo  This batch file requires that at least one file or folder is dropped onto it - & echo  Press any key to exit . . .& pause > nul & exit
@set drop__count=0
@set exist_count=0
@echo  ---  %%cmdcmdline%% is ...   (with no double quote control, special characters can cause errors in this command)
@echo %cmdcmdline%
goto Preproc_Params


=== Instructions:
Drop files and folders with names that contain ampersands or carets, and with and without spaces in them, onto this batch file.
Also, for media root drops: drop one and multiple drive letters onto this batch file.

=== Passes the cartoon swear word folder name test:  (This test's failures prompted this solution)
To see a failure: in the Test_Loop remove the @rem from either of the rem'd out lines, and drop onto this batch file a folder with this name...  !@#$+~%(-^&`,;)

=== To ensure there are double quotes surrounding each drop to a batch file, and then processing them:
(1) Enable Delayed Expansion to allow the %~d1 parameter within !! and for containing special characters.
(2) set params equal to the parameters by replacing the start of !cmdcmdline! through its first "<space> with "
(3) strip all double quotes within !params! while setting one pair of surrounding double quotes into !params!
(4) for multiple media root drops (drive letters): insert double quotes into !params! by replacing \<space> with \"<space>"
(5) for multiple file/folder drops: insert double quotes into !params! by replacing <space><drive:> with "<space>"<drive:>
(6) Disable Delayed Expansion so drops with an ! (exclamation mark) in their full name are workable.
(7) For Command to consume the quotes; parse the parameters, assign them to a variable, and process them in a called loop.
(8) During processing surround "%_Dropped%" with one pair of double quotes to disable the activation of special characters.


:Preproc_Params
@setlocal EnableDelayedExpansion
@set "params=!cmdcmdline:*" ="!"
@set params="!params:"=!"
@set "params=!params:\ =\" "!"
@set "params=!params: %~d1=" "%~d1!"
@setlocal DisableDelayedExpansion

@echo.
@echo  ---  double quote adjusted %%params%% with the start of %%cmdcmdline%% through its first "<space> replaced with "
@echo %params%

:: Split the parameters on spaces but respect and consume the quotes
@for %%G in (%params%) do (set "_Dropped=%%~G" & set /a "drop__count+=1" & call :Test_Loop)
goto TestLoop_Done


:Test_Loop
@if exist "%_Dropped%" (set /a "exist_count+=1") & (echo "%%_Dropped%%" is "%_Dropped%")
@if not exist "%_Dropped%" (echo "%_Dropped%"   does not exist, or it is drive letter with no media)

:: When not rem'd out, the following line with certain drops will cause a failure and possibly a window exit
@rem @(echo  %%_Dropped%%  is  %_Dropped%)

:: A second pair of surrounding double quotes acts the same as no quotes -- open quote is closed by the next quotation mark
@rem @(echo  ""%%_Dropped%%""  is  ""%_Dropped%"")

@exit /b


:TestLoop_Done
@echo.
@(echo   %%drop__count%%  is__  %drop__count%)
@(echo   %%exist_count%%  is__  %exist_count%)
@echo.
@echo   Press any key to exit . . . & pause > nul

::  Code end  ---
...