Descobri que precisava adicionar cmd /c
ao início do comando icacls
.
Meu arquivo de lote é assim:
for /f "tokens=*" %%i in (%1) do (
cmd /c "icacls.exe F:\home\%%i /grant %%i:(oi)(ci)(m)"
)
)
Isso funciona bem para mim.
Estou movendo os usuários para um novo domínio, servidor de arquivos e formato de nome de usuário. Estou tentando escrever um lote simples do DOS para copiar os dados e definir as permissões. X: é mapeado para o servidor antigo e E: é a unidade local no novo servidor. O arquivo de entrada é apenas uma lista de CSV de OldUserName, NewUserName. O arquivo CSV é State.users.csv. (O lote divide o estado para uso no caminho no novo servidor).
O arquivo em lote:
SETLOCAL EnableDelayedExpansion
FOR /F "delims=. tokens=1" %%a in ("%1") DO SET Site=%%a
FOR /F "delims=, tokens=1-2" %%c in (%1) do (
ROBOCOPY X:\Users\%%c E:\%Site%\User\%%d /E /Z
ICACLS "E:\%Site%\User\%%d" /grant "Domain Admins":(OI)(CI)F /Inheritance:r
ICACLS "E:\%Site%\User\%%d" /grant "SYSTEM":(OI)(CI)F
ICACLS "E:\%Site%\User\%%d" /grant "CREATER OWNER":(OI)(CI)F
ICACLS "E:\%Site%\User\%%d" /grant "%%d":(OI)(CI)F
IF NOT "%2"=="" RENAME X:\Users\%%c ZZZ-%%c
)
ENDLOCAL
Quando executado, o comando icacls morre com:
(CI)F was unexpected at this time.
ICACLS "E:\Ohio\User\%d" /grant "Domain Admins":(OI)(CI)F /Inheritance:r
e nunca roda o robocopy ...? (Com todos os icacls comentados, o robocopy funciona bem.)
No entanto, as linhas que retirei durante o teste ecoam as variáveis apropriadamente substituídas:
(
rem ROBOCOPY X:\Users\MDuffy E:\Ohio\User\Steve.Hrsk /E /Z
rem ICACLS "E:\Ohio\User\Steve.Hrsk" /grant "Domain Admins":(OI)(CI)F /Inheritance:r
rem ICACLS "E:\Ohio\User\Steve.Hrsk" /grant "SYSTEM":(OI)(CI)F
rem ICACLS "E:\Ohio\User\Steve.Hrsk" /grant "CREATER OWNER":(OI)(CI)F
rem ICACLS "E:\Ohio\User\Steve.Hrsk" /grant "Steve.Hrsk":(OI)(CI)F
IF NOT "" == "" RENAME X:\Users\MDuffy ZZZ-MDuffy
)
Eu posso copiar e colar essas linhas (menos o REM, é claro) no prompt de comando e o icacls funciona como esperado.
Eu tentei qoutes simples, aspas simples em torno das aspas duplas. Eu adicionei aspas ao comando robocopy e ele funciona bem (com single ou double).
Para o bem da minha sanidade, tirei o (CI) e depois ele morreu no F for Full.
Eu tentei com e sem o EnableDelayedExpansion, sem sorte.
Também removi o primeiro FOR / F. Mesmos resultados.
Em vez de REM, usei o ECHO e ainda recebo o erro "(CI) F foi inesperado ..." !!
Eu copiei e colei em um novo arquivo, tentei codificá-lo como ANSI e UTF-8, vi todos os caracteres ocultos (encontrei uma TAB entre ICACLS e "E: ..." no primeiro, mas substituindo por um espaço não ajudou). [Estou usando o Notepad ++]
Eu colei-o em um novo arquivo, salvei-o como arquivo de texto com codificação UTF-8 e renomei-o para .bat da linha cmd ....
Eu não sei porque a expansão da variável funciona bem para o Robocopy, mas não para o Icacls (quando não é REM'd).
O que estou perdendo aqui?
Descobri que precisava adicionar cmd /c
ao início do comando icacls
.
Meu arquivo de lote é assim:
for /f "tokens=*" %%i in (%1) do (
cmd /c "icacls.exe F:\home\%%i /grant %%i:(oi)(ci)(m)"
)
)
Isso funciona bem para mim.
Use um conjunto diferente de variáveis para copiar e outro para ICACLS. O Robocopy não era MS desde há alguns anos e o ICACLS usa variáveis diferentes - você só precisa de um if diferente. Você também pode usar o power shell para agrupar as variáveis ICACLS, o que torna tudo um pouco mais fácil link .
Use isto: link
for /f "tokens=*" %%i in (%1) do (
icacls.exe "F:\home\%%i" /grant "%%i:(oi)(ci)(m)"
)
)