cmd batch-脚本的“本地化的是消息或字母”的命令或别名

时间:2019-06-24 17:49:20

标签: batch-file cmd

我想创建一个cmd批处理脚本到文件夹中所有文件的takeown。现在我面临一个问题。 takeown在我的操作系统中已本地化为西班牙语,并且在切换s后需要y而不是/d来确认:

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

我想泛型地在不同的语言环境中使用它。就像使用脚本一样,它可以同时使用英语,西班牙语,德语,法语...

为此,我想知道cmd中的YESNO字母是否有全局别名。或者,给出给我们两个字母的命令的结果,也可以用于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 个答案:

答案 0 :(得分:2)

您可以执行此操作以捕获响应,因为它们始终是一个由双引号引起来的单个字符,然后您可以根据需要使用它们

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总是会在更早的地方进行本地化,因此我们可以使用它。

我使用ChoiceDATE经常使用的方法来玩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  )

希望是有帮助的:)

看起来像斯蒂芬(Stephan)的响应方式与我在写此内容并重新发布我注意到我已经在另一个窗口中打开的东西(尼斯完成@斯蒂芬())时基于OP的选择建议的反应类似。

答案 1 :(得分:2)

Ben Personick的答案对我不起作用(德语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.

我猜在某些语言中,“ YES”和“ NO”选项在同一行中,而在其他语言中,它们则在两行中。

EDIT 注释显示,尽管选择(YN)已本地化,但帮助文本不一定会反映出来。 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

答案 2 :(得分:1)

如果系统区域设置为0C0A(西班牙语),则此命令将使用/ d S,否则使用/ 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 )

答案 3 :(得分:1)

我使用以下内容确定“是”,“否”和“所有答案”(完整的单词)以及首字母。我最初是在DosTips.com论坛上的Determine Yes/No/All string for current locale开发此程序的。

@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%中创建文件,以“保证”用户具有写访问权限。
  • PUSHD%temp%目录以确保路径不包含在COPY输出中。不太可能,但是非标准的%temp%值可以包含()
  • 我假设COPYTAKEOWN对“是”和“否”使用相同的响应。我使用COPY是因为解析输出更容易,更可靠。
  • 正如斯蒂芬(Stephan)在其评论中指出的那样,我还假设每个回复的首字母都是唯一的。

答案 4 :(得分:0)

我发现一个可能有效的命令:choice。它也是本地化的。我明天再说。