Использование icacls в командном файле (вопрос скобок) - PullRequest
0 голосов
/ 03 мая 2018

Мне нужно скопировать папку со списком ПК в определенное место, а затем сделать эту папку «Полный доступ для всех» и передать ее во все подпапки и файлы. Я создаю текстовый файл со списком ПК, а затем включаю его в файл bat. Он выполняет простой пинг, чтобы увидеть, следует ли продолжить копирование, а затем выполняет простой оператор for / if / else, который обычно отлично работает для других задач «обслуживания» ... Однако в этом случае я не могу заставить команду icacls работать правильно. Команда, которую я изначально использовал, была такой:

for /f %%a in (add_pclist.txt) do (

ping -n 2 %%a

if errorlevel 1 ( 

    echo %%a >> Test_PCFileCopyFail.txt
) else (

xcopy/e/h/i/y FOLDERNAME "\\%%a\c$\users\Public\Desktop"
icacls "\\%%a\c$\users\Public\Desktop\HMI" /grant Everyone:F /T
echo %%a >> Test_PCFileCopySuccess.txt
)
)

Однако, хотя это делает копию и делает папку «Полный доступ» - когда я смотрю на вкладку «Безопасность» в «Свойствах», у всех нет галочек. Я выбираю «Дополнительно», и хотя «Все» отображается как «Полный доступ», для параметра «Яблоки» установлено значение «Только эта папка», и я хочу, чтобы в нем говорилось «Эта папка, подпапки и файлы».

Если я вручную запускаю cmd:

icacls "\\%%a\c$\users\Public\Desktop\HMI" /grant Everyone:(OI)(CI)F /T

это работает. Однако, когда я помещаю эту команду в командный файл, она выдает ошибку

(CI was unexpected at this time.

Есть ли способ выполнить часть «Относится к» без части (OI) (CI) - в противном случае, как я могу включить ее в пакетный файл без получения ошибки? Я также попытался включить / Legitance: E в исходную команду icacls, но безрезультатно.

Большое спасибо!

1 Ответ

0 голосов
/ 03 мая 2018

Поскольку команда icacls содержится в code block (заключенная в скобки последовательность команд), то ), как видно, закрывает этот code block, поэтому следующие за символами символы cmd являются следующей командой.

Решением является escape любой ), который предназначен для использования в качестве литерала, а не в качестве специального символа, который закрывает code block с помощью каретки ^.

Замените неправильный ) на ^) (их будет больше одного), чтобы ) считался обычным, а не специальным символом.

...