我想创建一个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中的YES
和NO
字母是否有全局别名。或者,给出给我们两个字母的命令的结果,也可以用于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.
答案 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
总是会在更早的地方进行本地化,因此我们可以使用它。
我使用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 )
希望是有帮助的:)
看起来像斯蒂芬(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 注释显示,尽管选择(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
答案 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%
值可以包含(
或)
。COPY
和TAKEOWN
对“是”和“否”使用相同的响应。我使用COPY
是因为解析输出更容易,更可靠。答案 4 :(得分:0)
我发现一个可能有效的命令:choice
。它也是本地化的。我明天再说。