cmd batch - команда или псевдоним для "локализованного сообщения да или буквы" для скриптов - PullRequest
1 голос
/ 24 июня 2019

Я хочу создать скрипт cmd batch для takeown всех файлов в папке.Теперь я столкнулся с проблемой.takeown локализован на испанский язык в моей ОС и требует s вместо y для подтверждения после /d switch:

:: for English it's Y, but for Spanish it is S
takeown /f "c:\cygwin" /r /d Y 

Я хочу быть универсальным, чтобы использовать его в другой локали.Например, со скриптом, он работает одновременно на английском, испанском, немецком, французском ...

Для этой цели я хочу знать, существует ли глобальный псевдоним для букв YES и NO вCMD.Или результат некоторой команды, которая дает нам две буквы и работает также для takeown.

PS: смелый ответ «Нет, это невозможно» также является верным ответом, если с правильной аргументацией.

Кстати, испанская версия takeown /d:

/D      pregunta             Respuesta predeterminada usada cuando el
                             usuario actual no tiene el permiso "listar
                             carpeta" en un directorio. Esto ocurre al
                             trabajar de manera recursiva (/R) con
                             subdirectorios. Son valores válidos "S" para
                             tomar posesión y "N" para omitir.

Ответы [ 5 ]

2 голосов
/ 24 июня 2019

Вы можете сделать это, чтобы поймать ответы , так как они всегда представляют собой один символ, окруженный двойными кавычками, , тогда вы можете использовать их по мере необходимости

for /F  delims^=^"^ Tokens^=2^,4 %A IN ('takeown /? ^| FIndStr /R /C:" """[A-Z]""" "') DO @( ECHO.Take: "%~A" Skip: "%~B" )

Для ваших нужд вы можете просто использовать:

for /F  delims^=^"^ Tokens^=2 %%A IN ('TakeOwn /?') DO @( TakeOwn /f "c:\cygwin" /r /d %%A  )

Для более подробной разбивки:

for /F  delims^=^"^ Tokens^=2^,4 %%A IN (
'takeown /?
^|
 FIndStr /R /C:" """[A-Z]""" "
') DO (
    SET "_TakeOwn_YES=%%~A"
    SET "_TakeOwn_NO=%%~B"
)

takeown /d %_TakeOwn_YES%

Я заметил некоторые отзывы о том, что Takeown не был локализован, так что, к сожалению, автор этого поста также предположил, что CHOICE всегда будет локализован в посте немного раньше, поэтому мы можем просто использовать это.

Я поиграл с Choice, используя методы, которые часто используются с DATE и SET /P, и обнаружил, что было легко определить утвердительный и отрицательный варианты для использования с TakeOwn или любым другим локализованным выбором.

Ниже тянет оба Ответа и показывает их

FOR /F "Tokens=1-2 Delims=[,]" %A IN ('
  echo.^|choice 2^>NUL
') DO @(
  ECHO.Affirmative: "%~A" Negative:  "%~B"
)

Для ваших нужд вы можете просто использовать:

FOR /F "Tokens=1 Delims=[," %%A IN ('echo.^|choice 2^>NUL') DO @( TakeOwn /f "c:\cygwin" /r /d %%A  )

Надеюсь, что это полезно:)

Похоже, Стефан ответил методом, подобным тому, который был основан на предложении ОП о выборе, когда я писал это и перепостил что-то, что заметил, что я открыл в другом окне, Nicely Done @Stephan:)

2 голосов
/ 24 июня 2019

Ответ Бена Персоника у меня не работает (немецкая Windows), поэтому я немного его расширил (уловка «спросить» takeown, какие ответы верны, великолепна):

@echo off
setlocal

for /F delims^=^"^ Tokens^=2^,4 %%A IN ('takeown /? ^| findstr /R " \"[A-Z]\" "') DO ( 
    ECHO Debug: Take: "%%A" Skip: "%%B"
    if not defined take (
      set "take=%%~A"
      if not "%%~B" == "" set "skip=%%~B" 
    ) else set "skip=%%~A" 
)
set take
set skip

Выход:

Debug: Take: "J" Skip: ""
Debug: Take: "N" Skip: ""
take=J
skip=N

для справки по соответствующей части takeown /?:

/D        Aufforderung       Standardantwort, die verwendet wird, wenn der
                             aktuelle Benutzer nicht die Berechtigung
                             "Ordner auflisten" für ein Verzeichnis hat.
                             Tritt bei der rekursiven Bearbeitung (/R)
                             von Unterverzeichnissen auf. Gültige Werte
                             sind "J" zum Übernehmen der Besitzrechte
                             oder "N" zum Auslassen dieses Schrittes.

Я полагаю, что в некоторых языках параметры "ДА" и "НЕТ" находятся в одной строке, а в других языках - в двух отдельных строках.

РЕДАКТИРОВАТЬ комментарии показывают, что, хотя варианты (Y или N) локализованы, текст справки не обязательно отражает это. choice - это одна из немногих команд, которые показывают возможные входные данные:

C:\>choice
[J,N]?

и это можно объяснить тем, что фактически не ожидает ввода, перенаправив NUL на STDIN. 2>nul подавляет сообщение об ошибке:

C:\>choice <nul 2>nul
[J,N]?
C:\>

Так что с for /f вокруг мы можем поймать буквы:

for /f "tokens=1,2 delims=[,]" %%a in ('"choice <nul 2>nul"') do set "yes=%%a" & set "no=%%b"
echo Press %yes% for yes and %no% for no
1 голос
/ 26 июня 2019

Я использую следующее, чтобы определить Да, Нет и Все ответы (полные слова), а также начальные буквы.Первоначально я разработал это в Определите строку Да / Нет / Все для текущей локали более на форуме DosTips.com.

@echo off
setlocal
call :getYesNoAll

:: Show Results
set Response

exit /b


:getYesNoAll
pushd "%temp%"
copy nul getYesNoAll.tmp >nul
set "ResponseYes="
for /f "tokens=2-4 delims=(/)" %%A in (
  '"<nul copy /-y nul getYesNoAll.tmp"'
) do if not defined ResponseYes (
  set "ResponseYes=%%A"
  set "ResponseNo=%%B"
  set "ResponseAll=%%C"
)
set "ResponseY=%ResponseYes:~0,1%"
set "ResponseN=%ResponseNo:~0,1%"
set "ResponseA=%ResponseAll:~0,1%"
del "getYesNoAll.tmp"
popd
exit /b

- Вывод на мой английский компьютер -

ResponseA=A
ResponseAll=All
ResponseN=N
ResponseNo=No
ResponseY=Y
ResponseYes=Yes

Некоторые моменты проектирования, которые могут быть неочевидны:

  • Я создаю временный файл с известным именем, чтобы гарантировать, что имя файла не содержит символ-разделитель ( или ).Обратите внимание, что / в любом случае не может появляться в имени или пути.
  • Я создаю файл в %temp%, чтобы «гарантировать», что у пользователя есть права на запись.
  • I PUSHD вКаталог %temp% для гарантированного пути не включен в вывод COPY.Маловероятно, но нестандартное значение %temp% может включать ( или ).
  • Я предполагаю, что COPY и TAKEOWN используют одинаковые ответы для Да и Нет. Я использую COPY, потому что анализировать выходные данные проще и надежнее.
  • Как отмечает Стефан в своем комментарии, я также предполагаю, что первая буква каждого ответа уникальна.
1 голос
/ 24 июня 2019

Эта команда будет использовать / d S, если языковой стандарт системы 0C0A (испанский), иначе / d Y

for /f "skip=2" %%a in ('"wmic os get locale | sort /r"') do if /i %%a EQU 0C0A ( takeown /f "c:\cygwin" /r /d S ) else ( takeown /f "c:\cygwin" /r /d Y )
0 голосов
/ 25 июня 2019

Я нашел команду, которая может работать: choice. Он также локализован. Я могу уточнить завтра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...