Bat имена файлов с пробелами

В средах командной строки, таких как командная строка Windows и PowerShell, пробелы используются для разделения команд и аргументов, но имена файлов и папок также могут содержать пробелы. Чтобы указать путь к файлу имеющего символ пробела в названии или пути к файлу, вам нужно «экранировать» его.

Почему нужно избегать символ пробела?

«Пробел» в названии файла или папки, может препятствовать правильной обработке команды, экранирование пробела заставит оболочку рассматривать его как стандартный пробел, а не как специальный символ, разделяющий аргументы командной строки.

Например, предположим, что у вас есть текстовый файл, содержимое которого вы хотите просмотреть. Вы можете сделать это с помощью команды type
. Предполагая, что текстовый файл находится по адресу C:\Папка\File.txt
, следующая команда в командной строке покажет содержимое файла:

Отлично! А что, если у вас есть такой же файл по адресу C:\Новая папка\File.txt?
Если вы попробуете выполнить приведенную ниже команду, это не сработает – пробелы в пути к файлу мешают правильно обработать команду.

 type C:\  Новая папка 
\File.txt 

Командная строка считает, что вы пытаетесь найти файл с именем Новая
, в результате вы получаете:  «Ошибка во время обработки: C:\Новая.

Системе не удается найти указанный путь.».
Тоже самое будет? если пробел есть в имени файла New File.txt

Ошибка командной строки при отсутствии экранирования пробелов

Три способа избежать ошибок из-за символа пробел в Windows 10

Есть три разных способа избежать проблем используя пробел в пути к файлу Windows:

  1. Заключив путь (или его части) в двойные кавычки (
    ).
  2. Добавляя символ вставки ( ^
    ) перед каждым пробелом. ( Это работает только в командной строке / CMD.)
  3. Добавляя знак ударения ( `
    ) перед каждым пробелом. ( Это работает только в PowerShell.)

Мы покажем вам, как использовать каждый из перечисленных способов.

Заключите путь к файлу в кавычки (“)

Стандартный способ убедиться, что Windows правильно обрабатывает путь к файлу, – заключить его в двойные кавычки "
. Например, в нашем примере команды выше мы просто выполняем следующее:

 type "C:\  Новая папка 
\Test File.txt" 

Вы можете заключить части пути в кавычки, если хотите. Например, предположим, что у вас есть файл с именем File.txt в этой папке. Вы можете запустить следующее:

 type C:\"  Новая папка 
"\File.txt 

Однако в этом нет необходимости – в большинстве случаев вы можете просто заключить весь путь в кавычки.

Это решение работает как в традиционной среде командной строки (CMD), так и в Windows PowerShell.

Заключение пробелов в двойные кавычки в командной строке

Используйте символ каретки для правильной обработки пробелов (^)

В командной строке символ каретки ^
 теоретически позволяет избежать пробелов. Просто добавьте его перед каждым пробелом в имени файла. ( Вы найдете этот символ в числовом ряду на клавиатуре. Чтобы ввести символ каретки, нажмите Shift
+ 6
.)

Вот проблема: хотя это должно работать, а иногда и работает, это работает не всегда. Командная строка обрабатывает этот символ странно.

Например, запустите следующую команду, но она не сработает:

 type C:\  Новая 
^  папка 
\Test^ File.txt 

Ошибка экранирования пробела в командной строке

С другой стороны, если мы попытаемся открыть наш файл напрямую, введя его путь в командную строку, мы увидим, что символ каретки правильно экранирует пробелы:

 C:\  Новая 
^  папка 
\Test^ File.txt 

Экранирование пробела каретки работает в командной строке

Итак, когда это работает? Что ж, исходя из нашего исследования, похоже, что с некоторыми приложениями он работает, а с другими – нет. Это может варьироваться в зависимости от команды, которую вы используете. Командная строка обрабатывает этот символ странно. Если вам интересно, попробуйте с любой командой, которую вы используете, – она ​​может работать, а может и не работать.

Мы рекомендуем использовать двойные кавычки в командной строке или переключиться на PowerShell и использовать способ, рассмотренный ниже.

Используйте символ ударения (`)

PowerShell использует знак ударения `
 в качестве символа-пробела. Просто добавьте его перед каждым пробелом в имени файла. ( Вы найдете этот символ над клавишей Tab
и под клавишей Esc
на клавиатуре.)

 type C:\  Новая 
`  папка 
\Test` File.txt 

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

:/>  Как обновить драйвера видеокарты на Виндовс 10 | Интернет и компьютер

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

Обратите внимание, что это работает только в среде PowerShell. В командной строке вам нужно будет использовать символ каретки.

Если вы знакомы с UNIX-подобными операционными системами, такими как Linux и macOS, вы, возможно, привыкли использовать символ обратной косой черты ( \
) перед пробелом, чтобы правильно обработать команду. Windows использует его для пути к файлам, поэтому он не работает – символы каретки ( ^
) и ударения ( `
) это своего рода обратная косая черта Windows в зависимости от того, какую оболочку вы используете.

Доброго времени суток.

Есть много файлов в папке таких как:

Т1253663 .jpg

Т1253632 .jpg

Т125362 .jpg

Т125362.jpg

Задача заключается в том, что через bat нужно переименовать

эти файлы, так чтобы они были совсем без пробелов.

Я особо не понимаю bat, поэтому вопрос к вам знатоки)

Заранее спасибо.

задан 15 янв 2018 в 1:03

Frog Frogov's user avatar

У меня прибор не понимает пробелы в файлах, поэтому приходится часто запускать такой скрипт (он удаляет все пробелы в именах файлов):

 :renameNoSpace [/R] [FolderPath]
@echo off
setlocal disableDelayedExpansion
if /i "%~1"=="/R" ( set "forOption=%~1 %2" set "inPath="
) else ( set "forOption=" if "%~1" neq "" (set "inPath=%~1\") else set "inPath="
)
for %forOption% %%F in ("%inPath%* *") do ( if /i "%~f0" neq "%%~fF" ( set "folder=%%~dpF" set "file=%%~nxF" setlocal enableDelayedExpansion echo ren "!folder!!file!" "!file: =!" ren "!folder!!file!" "!file: =!" endlocal )
) 

Использование: назовите его, допустим, delspaces.bat, и используйте так:

 delspaces.bat [без аргументов]: работает в текущем каталоге
delspaces.bat /R : переименовывает файлы во всём дереве папок, начиная с текущей
delspaces.bat папка : переименовывает файлы в каталоге "папка", найденном в текущем каталоге
delspaces.bat "c:\my folder\" : Переименовывает файлы по указанному пути  

ответ дан 15 янв 2018 в 2:14

Viktor Tomilov's user avatar

Viktor Tomilov

4 золотых знака
25 серебряных знаков
63 бронзовых знака

А если я делаю переименование на машине, где есть powershell, то использую такой скрипт:

 dir |
Where-Object { $_.name.Contains(" ") } |
Rename-Item -NewName { $_.name -replace " ","" } 

Я понимаю, что это не BAT, но работает весьма быстрее. Чтобы использовать, сохраните как имя_файла.ps1, а затем правый клик – запустить.

ответ дан 15 янв 2018 в 2:16

Viktor Tomilov's user avatar

Viktor Tomilov

4 золотых знака
25 серебряных знаков
63 бронзовых знака

Имя по типу “name_ 02227.log”.

Eсть пробел между “_” и “0”. Присутствует он не всегда. Как удалить?

Я хотел создать проверку на пробел, но она не работает:

 SET str=" 0122017"
IF %str:~0,1%==" " (SET str=%str:~1%) 

” (SET str= 0122017″) was unexpected at this time.

br3t's user avatar

4 золотых знака
16 серебряных знаков
29 бронзовых знаков

задан 29 авг 2017 в 10:22

Superluminal's user avatar

5 серебряных знаков
27 бронзовых знаков

  • 29 авг 2017 в 10:30

  • Хочу сделать это автоматически, а не руками. фалов генерируеться много.

    29 авг 2017 в 10:32

  • 1) Вот зачем кавычки в первом SET? не бывает кавычек в имени файла
    . 2) Не для BAT/CMD задачка-то, лучше на VBS выполнить требуемое.

    29 авг 2017 в 11:42

  • А что там можно поставить? Я из мира Java, я замечаю что строки работают совсем по другому в батах. Для меня не понятно в чем тут проблема. Имя фала генерируеться в bat-e и мне нужно его изменить там же. Это невозможно?

    29 авг 2017 в 11:57

  • Мне тружно представить, что он не может справиться с такой легкой залдачей.

    29 авг 2017 в 11:57

1 ответ

Правильный вызова обработки текста удалением пробелов в примере.

 SET str=" 0122017"
set str=%str: =%
echo %str% 

ответ дан 31 авг 2017 в 16:11

:/>  Не открываются «Параметры» в Windows 10 » | Все самое интересное из мира IT-индустрии

Daemon-5's user avatar

9 серебряных знаков
15 бронзовых знаков

Пишите нам!

Архитектурная мастерская.

Продвижение сайтов от optimism.ru

Page generation time: 0.0761s (PHP: 58% – SQL: 42%) – SQL queries: 44 – GZIP disabled – Debug off

  1. You’re not going to get prompted for UAC authorization, even if logged in as the administrator and
  2. RUNAS expects that you have the administrator password, even if your user is setup as a local administrator, in which case the former password is not a sound security practice, specially in work environments.
 @echo off
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' ( echo Requesting Admin access... goto goUAC ) else goto goADMIN
:goUAC echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" set params = %*:"="" echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs" "%temp%\getadmin.vbs" del "%temp%\getadmin.vbs" exit /B
:goADMIN pushd "%CD%" CD /D "%~dp0"
rem --- FROM HERE PASTE YOUR ADMIN-ENABLED BATCH SCRIPT ---
echo Stopping some Microsoft Service...
net stop sqlserveragent
rem --- END OF BATCH ---- 

This solution works 100% under Windows 7, 8.1 and 10 setups with UAC enabled.

Всем привет
Есть bat скрипт на автоматическое подключение к впн/команду route add/подключение дисков с серверной.
Всё бы ничего, да только команда route add должна выполняться через cmd с правами администратора.
Вопрос, как можно выполнить bat скрипт, чтобы он открылся не в обычной cmd, а с правами администратора ?

void's user avatar

1 золотой знак
25 серебряных знаков
33 бронзовых знака

задан 25 фев в 13:11

Gwardios's user avatar

Это делается с помощью runas.

 runas /user:Administrator "cmd /k {fullpath}\file.bat" 

ответ дан 25 фев в 15:00

void's user avatar

1 золотой знак
25 серебряных знаков
33 бронзовых знака

У меня получилось только создав ярлык к этому батнику.

ответ дан 28 фев в 4:50

Герман Борисов's user avatar

Герман Борисов

14 серебряных знаков
37 бронзовых знаков

Colin Brock's user avatar

9 gold badges
46 silver badges
61 bronze badges

asked Jul 17, 2012 at 14:44

JChan's user avatar

This script does the trick! Just paste it into the top of your bat file. If you want to review the output of your script, add a “pause” command at the bottom of your batch file.

This script is now slightly edited to support command line args.

 @echo off
:: BatchGotAdmin
::-------------------------------------
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' ( echo Requesting administrative privileges... goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" set params = %*:"=" echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs" "%temp%\getadmin.vbs" del "%temp%\getadmin.vbs" exit /B
:gotAdmin pushd "%CD%" CD /D "%~dp0"
::--------------------------------------
::ENTER YOUR CODE BELOW: 

Edudjr's user avatar

18 silver badges
28 bronze badges

answered Mar 13, 2015 at 7:19

Lokesh Kumar's user avatar

Lokesh Kumar

2 gold badges
8 silver badges
13 bronze badges

In the first use

 runas /noprofile /user:mymachine\administrator yourbatchfile.bat 

Upon further reading, you must be able to type in the password at the prompt. You cannot pipe the password as this feature was locked down for security reasons.

You may have more luck with psexec
.

answered Jul 17, 2012 at 14:47

Bali C's user avatar

Bali C

35 gold badges
123 silver badges
152 bronze badges

Press Ctrl
+ Shift
and double-click a shortcut to run as an elevated process.

Works from the start menu as well.

Sunil Garg's user avatar

25 gold badges
132 silver badges
188 bronze badges

answered May 18, 2015 at 8:13

caractacus's user avatar

1 silver badge
1 bronze badge

You need to enclose your code within this wrapper:

 if _%1_==_payload_ goto :payload
:getadmin echo %~nx0: elevating self set vbs=%temp%\getadmin.vbs echo Set UAC = CreateObject^("Shell.Application"^) >> "%vbs%" echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%" "%temp%\getadmin.vbs" del "%temp%\getadmin.vbs"
goto :eof
:payload echo %~nx0: running payload with parameters: echo %* echo --------------------------------------------------- cd /d %2 shift shift rem put your code here rem e.g.: perl myscript.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
goto :eof 
  • word payload
    , to indicate this is payload call, i.e. already elevated. Otherwise
    it would just open new processes over and over.

  • directory path where the main script was called. В связи с тем, что Windows всегда

    запускает cmd.exe с повышенными правами в «%windir%\system32», нет простого способа узнать, что
    исходный путь был ( и
    сохраняя возможность копировать ваш сценарий без
    трогательный код)

:/>  Как изменить шрифт в командной строке Windows » VripMaster

Примечание:
К сожалению, по какой-то причине shift
не работает для %*
, так что если вам нужно
чтобы передать фактические аргументы, вам придется прибегнуть к уродливой нотации, которую я использовал
в примере ( %1 %2 %3 %4 %5 %6 %7 %8 %9
), что также приводит к пределу
максимум 9 аргументов

Community's user avatar

ответил 22 авг 2012 в 12:08

Alois Mahdal's user avatar

Алоис Махдал

7 золотых значков
51 серебряный значок
69 бронзовых знаков

Чтобы предотвратить сбой сценария, когда файл сценария находится на несистемном диске (c:) и в каталоге с пробелами.

 @echo off
if _%1_==_payload_ goto :payload
:getadmin echo %~nx0: elevating self set vbs=%temp%\getadmin.vbs echo Set UAC = CreateObject^("Shell.Application"^) >> "%vbs%" echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%" "%temp%\getadmin.vbs" del "%temp%\getadmin.vbs"
goto :eof
:payload
::ENTER YOUR CODE BELOW::
::END OF YOUR CODE::
echo.
echo...Script Complete....
echo.
pause 

ответил 6 окт 2017 в 18:47

Northstrider's user avatar

13 серебряных значков
14 бронзовых знаков

Затем просто скройте пакетный файл и запустите ярлык.

Таким образом, вы даже можете установить собственную иконку для ярлыка.

ответил 5 июля 2013 в 22:38

jojois74's user avatar

5 серебряных значков
10 бронзовых знаков

Это работает для меня в Windows 7–10 с параметрами, при запуске приложения или файла из любого места (включая браузер), а также при доступе к файлу из любого места. Замените ( ВАШ ПАКЕТНЫЙ СЦЕНАРИЙ ЗДЕСЬ
якорь) с вашим кодом. Это решение может помочь 🙂

 @echo off
call :isAdmin
if %errorlevel% == 0 ( goto :run
) else ( echo Requesting administrative privileges... goto :UACPrompt
)
exit /b
:isAdmin fsutil dirty query %systemdrive% >nul
exit /b
:run <YOUR BATCH SCRIPT HERE>
exit /b
:UACPrompt echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" echo UAC.ShellExecute "cmd.exe", "/c %~s0 %~1", "", "runas", 1 >> "%temp%\getadmin.vbs" "%temp%\getadmin.vbs" del "%temp%\getadmin.vbs"
exit /B 

GChuf's user avatar

1 золотой значок
16 серебряных значков
28 бронзовых знаков

ответил 12 декабря 2015 в 0:20

krishnakumar sekar's user avatar

Примерно так:

 if "%~s0"=="%~s1" ( cd %~sp1 & shift ) else ( echo CreateObject^("Shell.Application"^).ShellExecute "%~s0","%~0 %*","","runas",1 >"%tmp%%~n0.vbs" & "%tmp%%~n0.vbs" & del /q "%tmp%%~n0.vbs" & goto :eof
) 

ответил 23 мая 2014 в 9:34

dev5er6's user avatar

1 серебряный значок
2 бронзовых знака

ответил 20 декабря 2015 в 9:10

bajla's user avatar

2 золотых значка
2 серебряных значка
12 бронзовых знаков

 @echo off
powershell -Command "Start-Process cmd -Verb RunAs -ArgumentList '/k cd /d %~dp0'"
exit  

ответил 23 июл в 19:49

Mohebbikhah's user avatar

Вот более простая версия того же файла.

 @echo off
break off
title C:\Windows\system32\cmd.exe
cls
:cmd
set /p cmd=C:\Enter Command:
%cmd%
echo.
goto cmd 

Sunil Garg's user avatar

25 золотых значков
132 серебряных значка
188 бронзовых знаков

ответил 21 августа 2017 в 7:42

gaws's user avatar

Напишите текст с помощью блокнота или любого текстового редактора по вашему выбору. Откройте блокнот, напишите эту короткую команду «cmd.exe» без кавычек и сохраните ее как cmd.bat.

templatetypedef's user avatar

ответил 24 июля 2016 в 17:28

pango's user avatar