icacls variáveis no arquivo de lote

1

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?

    
por SteveH 22.04.2015 / 03:11

3 respostas

1

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.

    
por 29.07.2015 / 14:39
0

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 .

    
por 22.04.2015 / 11:14
0

Use isto: link

for /f "tokens=*" %%i in (%1) do (
        icacls.exe "F:\home\%%i" /grant "%%i:(oi)(ci)(m)"
    )
)
    
por 28.12.2016 / 09:09