这是我的批处理脚本,我用它自动与" Everyone"共享特定文件夹。您可能已经注意到我必须首先使用当前安装的语言提取名称。对于法语版本,正确的字符串是" Tout le monde" (大家)。问题是,我只能得到#34; Tout"并且忽略了空间之后的一切。
C:\WINDOWS\system32>net share SharedFolder="C:\Temp\SharedFolder" /GRANT:Tout,FULL
不共享结果文件夹。有没有人知道如何改进这个脚本以获得所有空格的全名?
set MySid=S-1-1-0
for /f "delims= " %%a in ('"wmic path win32_account where SID='%MySid%' get name"') do (
if not "%%a"=="Name" (
set myvar=%%a
goto :loop_end
)
)
:loop_end
net share SharedFolder /DELETE /Y
net share SharedFolder="C:\Temp\SharedFolder" /GRANT:%myvar%,FULL
icacls "C:\Temp\SharedFolder" /T /C /Q /Grant:R *%MySid%:(OI)(CI)F
icacls "C:\Temp\SharedFolder" /T /C /Q /inheritance:e
pause
答案 0 :(得分:1)
如果您显示了正在接收的实际wmic
输出,那将会很有帮助。根据我的英文版本,我建议
删除
=
子句中"
和delims
之间的空格。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
set MySid=S-1-1-0
for /f "delims=" %%a in ('"wmic path win32_account where SID='%MySid%' get name"') do (
SET "line=%%a"
CALL :striptrailing
if not "!line!"=="Name" (
set "myvar=!line!"
goto :loop_end
)
)
:loop_end
SET my
ECHO ==="%myvar%"---
GOTO :EOF
:striptrailing
IF NOT DEFINED line GOTO :EOF
SET "line=%line:~0,-1%"
IF NOT DEFINED line GOTO :EOF
if "%line:~-1%"==" " GOTO striptrailing
GOTO :eof
wmic
输出行由CRCRLF终止,而不是按照惯例终止CRLF。因此,当%%a
为空时delims
为空的最后一个字符是CR - 这会混淆传统处理。
以空格作为分隔符,%%a
将在第一行获取Name
- 但这是欺骗性的,因为实际输出为Name [CR]
因此delims
正确选择{{} 1}}。
在下一个输出行,用英语获取Name
,再次“正确”选择Everyone [CR]
。如果用户为Everyone
,则会失败,因为它只选择Atak Snajpera
。
所以 - 我们需要关闭Atak
以获取整行,然后通过删除最后一个字符(将是CR)来操纵delims
和任何尾随空格。这必须通过用户变量(我选择line
)来完成,因为在元变量上不允许子串。
为了访问代码块中uservariable的运行时值,您需要调用line
。
delayedexpansion
例程无条件地删除最后一个字符(我们知道它是CR),然后在:striptrailing
的最后一个字符是空格时继续。
在审核代码时,我相信可以进行一些改动。
首先,由于我们知道第一行将是line
,我们可以使用Name
中的skip=1
直接访问第二行,从而删除for
的要求}以及if
- 我们需要做的就是将例程移到delayedexpansion
之后,以处理终端CR和空格。然后就不需要使用loop_end
- line
了。
对于那些感兴趣的人,我将把它留作练习。