Назад | Перейти на главную страницу

рекурсивный перенос без привязки к языку

В .bat файлы для cmd.exe Windows, рекурсивное владение содержимым папки переходит

takeown /f foldername /r /d Y >nul: 2>&1

Проблема в том, что это работает, только если в текущем языковом стандарте используется слово да начинается с буквы Y. Например. он не работает на французском языке, который использует Oui, поэтому требует O.

Любой обходной путь?

Вы можете использовать COPY команда для определения ответа «да», используемого машиной.

@echo off
setlocal
for /f "delims=(/ tokens=2" %%Y in (
  '"copy /-y nul "%~f0" <nul"'
) do if not defined yes set "yes=%%Y"
takeown /f foldername /r /d %yes% >nul 2>&1

В %yes% значением будет все слово, а не только первая буква. Я думаю, это сработает. Но если я ошибаюсь, вы можете просто использовать %yes:~0,1% вместо.

Обновить Как указывает в своем комментарии fgrieu, приведенное выше не удастся, если путь к сценарию включает (. Сбой из-за других специальных символов можно исправить, отказавшись от внешних двойных кавычек и избегая перенаправления. Но ( проблематично.

Вот альтернативная стратегия, которая работает, пока %temp% указывает на допустимую папку, в которой у пользователя есть права записи. Он создает файл с известным именем, не вызывающим проблем. Если файл уже существует в %temp% тогда его никто не беспокоит.

@echo off
setlocal
pushd "%temp%"
if not exist getYes.tmp (call ) >>getYes.tmp
set "yes="
for /f "delims=(/ tokens=2" %%Y in (
  '"copy /-y nul getYes.dummy <nul"'
) do if not defined yes set "yes=%%Y"
takeown /f foldername /r /d %yes% >nul 2>&1

Я полагаю, нет никакой гарантии, что COPY и TAKEOWN используют один и тот же ответ «да», но я был бы шокирован, если бы они этого не сделали.