通过法语窗口上的批处理脚本共享文件夹

时间:2017-09-10 11:29:16

标签: batch-file

这是我的批处理脚本,我用它自动与" 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

1 个答案:

答案 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了。

对于那些感兴趣的人,我将把它留作练习。