2017-06-11 11 views
1

これは実際には動作していますが、私が好む形式ではありません。以下のコードは私が望むものを達成します。書き込み可能な標準ユーザープロファイルのフォルダを作成します(Defaultなどのシステムプロファイルでは動作しません)、一部のソフトウェアに必要なものがあり、関連する権限が与えられます。icaclsが括弧で括られています

for /d %%A in ("C:\Users\*") do mkdir "%%~fA\AppData\Local\Folder1" 
for /d %%A in ("C:\Users\*") do mkdir "%%~fA\AppData\Local\Folder1_Ltd" 
for /d %%A in ("C:\Users\*") do icacls "%%~fA\AppData\Local\Folder1" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e 
for /d %%A in ("C:\Users\*") do icacls "%%~fA\AppData\Local\Folder1_Ltd" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e 

これは少し上のようです。私はちょうどユーザーのフォルダを介して1つのループを持っているし、すべての関数のユーザーループを保存、コマンドを一覧表示するために角かっこを使用したいと思います。しかし、私が以下を試してみると、フォルダを作ることさえできません。私がコマンドラインを使ってデバッグすると、この時点で "everyone"が予期しなかったところで停止します。なぜわからないのですか?どんなアドバイスも歓迎します、ありがとう。

for /d %%A in ("C:\Users\*") do (
mkdir "%%~fA\AppData\Local\Folder1" 
mkdir "%%~fA\AppData\Local\Folder1_Ltd" 
icacls "%%~fA\AppData\Local\Folder1" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e 
icacls "%%~fA\AppData\Local\Folder1_Ltd" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e 
) 
pause 

答えて

1

あなたものみ、通常のユーザープロファイルにアクセスするためにWMIを使用することができます。

@Echo Off 
For /F "Skip=1 Delims=" %%A In (
    '"WMIc Path Win32_UserProfile Where (Special!='True') Get LocalPath"' 
    ) Do For /F "Delims=" %%B In ("%%A") Do Call :Sub %%B 
Pause>Nul 
GoTo :EOF 

:Sub 
For %%A In (Folder1 Folder1_Ltd) Do (If Not Exist "%*\AppData\Local\%%A\" (
     MD "%*\AppData\Local\%%A") 
    ICACLS "%*\AppData\Local\%%A" /T /C /Q /grant:r Everyone:(OI^)(CI^)F /inheritance:e) 
+0

うわー、ここでそれほど多くの知識を求めるクールな愛です。誰もがすぐにこれらのすべてを試すことに感謝します。 :) – Tika9o9

+0

すべての答えが優れており、実行可能です!私はそれがボーナス、次の&非常にきちんと追加されているユーザープロファイル(システムではない)のみを使用する機能を追加したので、これをチェックします。皆さんありがとう!!! – Tika9o9

+0

Echoの部分を新しい最後の行に置いてください。おそらく '/ inheritance:e'の後で閉じ括弧の前に' && Set "_ = T" 'を追加してください。新しい最後の行 'If"%_% "==" T "コンピュータに適用されたエコー許可が成功しました。 – Compo

4

(コードブロック)内の閉じ括弧をすべてエスケープして、ブロックの最後と解釈しないようにする必要があります。

for /d %%A in ("C:\Users\*") do (
    mkdir "%%~fA\AppData\Local\Folder1" 
    mkdir "%%~fA\AppData\Local\Folder1_Ltd" 
    icacls "%%~fA\AppData\Local\Folder1" /T /C /grant(:r^) "Everyone":(OI^)(CI^)(F^) /inheritance:e 
    icacls "%%~fA\AppData\Local\Folder1_Ltd" /T /C /grant(:r^) "Everyone":(OI^)(CI^)(F^) /inheritance:e 
) 
pause 

編集eryksunは、サブルーチンを使用する代替手段です示唆したとして(^エスケープを挿入するために、エディタを使用すると、大したことないですが)

@Echo off 
for /d %%A in ("C:\Users\*") do Call :Sub "%%~fA" 
pause 
Goto :Eof 
:Sub 
mkdir "%~f1\AppData\Local\Folder1" 
mkdir "%~f1\AppData\Local\Folder1_Ltd" 
icacls "%~f1\AppData\Local\Folder1" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e 
icacls "%~f1\AppData\Local\Folder1_Ltd" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e 
+2

どう代わりにサブルーチンを呼び出すことについては?これはあまり面倒でなく、エラーを起こしやすいようです。 – eryksun

+0

@eryksun Ack、この代替案を追加しました。 – LotPings

+0

ああ、意味があります。ありがとう:)ちょうどすぐにPCから離れていますので、後で試して、答えとしてマークします。 – Tika9o9

4

別の方法としては、不要な括弧を削除することができ、必要なものを引用する

カッコgrantスイッチであり、その後のことができます

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for /d %%A in ("C:\Users\*") do (
     for %%F in ("%%~fA\AppData\Local\Folder1" "%%~fA\AppData\Local\Folder1_Ltd") do (
      mkdir "%%~fF" 
      icacls "%%~fF" /T /C "/grant(:r)" "Everyone":"(OI)(CI)(F)" /inheritance:e 
     ) 
    ) 

ノート:(/grant場合)引用された引数に対処するためのicacls habilityがある場合は、Windows 10上で試験した両方の例は、私はこの時点でテストすることはできません以前のOSバージョンに存在します。注2

icacls.exeのWindows 2003のサーバーSP2バージョン(最初のバージョンに公開)で(まあ、/inheritanceスイッチが存在していなかった)問題なくテストされています。 eryksunが指摘するように、追加の引用符はCRTによって削除されます。

+1

Windows 10では、icacls.exeはプライベートWindows CRT msvcrt.dllにリンクし、 'wmain'エントリポイントを使用します。私はこの基本的なデザインが古いバージョンから変更されているとは思わないので、確かめるためのテストはしていませんが、これもWindows 7でも動作すると賭けています。解析時にCRTは '' %%〜fF "'、 ''/grant(:r) ''、 '' Everyone ''、' '(OI)(CI)(F)' 'の引用符を取り除かなければなりませんコマンドラインを 'argv'配列に追加します。 – eryksun

+0

@eryksun、ありがとう、これが私の考えですが、実行ファイルは['GetCommandLine'](https://msdn.microsoft.com/es-es/library/windows/desktop/ms683156%28v= vs.85%29.aspx)APIを使用して、独自のパーサーをコマンドライン上に実装し、 'argc/argv'の代わりに使用するか、または完全なまたは部分的な動作をバージョン間で変更できます。この瞬間、私はw10実行可能ファイル以外の何もデバッグできません。これがノートの理由です。わかりません。 –

+0

すべてのWindowsプログラムと同様に、icacls.exeは 'GetCommandLine'を呼び出してコマンドラインを解析しますが、MicrosoftのCRTを使用しています。これには[既知の動作](https://msdn.microsoft.com/en-us/library)があります/ 17w5ykft.aspx)。 Windows 7のバージョンを確認することを忘れないでください。 – eryksun