1

おはようございます。

私が持っているバッチ スクリプトに問題があります。変数をフィードするプログラムがあり、その変数を使用してフォルダーを作成し、それに Icalcs アクセス許可を適用します。何らかの理由で、変数名のフォルダーが作成されますが、Icalcs は変数があるべき場所で空白になります。ここにコードがあります -

set whodo=%2
set username=%whodo%
set path="\\example\shares\Student\%username%"

md %path%
md %path%\Desktop
md %path%\Contacts
md %path%\Favorites
md %path%\Links
md %path%\Music
md %path%\Pictures
md %path%\Saved Games
md %path%\Searches
md %path%\Video
md %path%\Documents

c:\windows\system32\icacls.exe %path% /T /C /inheritance:e /grant:r %username%:(OI)(CI)M

%2 は、このスクリプトを実行するプログラムから変数を取得しています。次に、その変数を別の変数に入れて、それが Icacls を満足させるかどうかを確認しましたが、そうではありません。プログラムから引き出された変数がなければ、このスクリプトは正常に機能します。Path 変数と Username 変数が Icacls 以外の場所で機能する理由がわかりません。これは icacls にあるいくつかの欠陥ですか?

ありがとう

4

1 に答える 1

1

コマンド プロンプト ウィンドウを開き、実行setして、事前定義された環境変数のリストを出力します。定義済みの各環境変数の説明については、たとえばWindows 環境変数に関するウィキペディアの記事を参照してください。

定義済みの環境変数は、バッチ ファイルで変更しないでください。ただし、それを行う十分な理由がある場合を除きますUSERNAMEPATH

最初のケースでは、二重引用符も文字列値の一部として環境変数に割り当てられ、おそらく既存の末尾のスペース/タブも割り当てられるため、set variable="value"代わりに使用する場合にも注意してください。set "variable=value"詳細な説明については、次の回答を参照してください。

また、1 つ以上のスペースを含む文字列は二重引用符で囲む必要があります。これは、二重引用符で囲まれた文字列内にスペース文字が見つからない場合、文字列の区切り文字として使用されるためです。ユーザーの名前にはスペースが含まれる場合があります。ディレクトリ名Saved Gamesには間違いなくスペースが含まれています。

このバッチ コードを使用することをお勧めします。

rem Get name of user with surrounding double quotes removed.
set "whodo=%~2"
set "NameUser=%whodo%"
set "PathUser=\\example\shares\Student\%NameUser%"

rem Create directories for this user on server. With command extensions
rem enabled as by default the command MD creates the entire directory
rem tree if that is necessary. Therefore it is not necessary to create
rem separately the profile directory of the user first.
md "%PathUser%\Desktop"
md "%PathUser%\Contacts"
md "%PathUser%\Favorites"
md "%PathUser%\Links"
md "%PathUser%\Music
md "%PathUser%\Pictures"
md "%PathUser%\Saved Games"
md "%PathUser%\Searches"
md "%PathUser%\Video"
md "%PathUser%\Documents"

%SystemRoot%\System32\icacls.exe "%PathUser%" /T /C /inheritance:e /grant:r "%NameUser%:(OI)(CI)M"

使用するコマンドとその動作を理解するには、コマンド プロンプト ウィンドウを開いて次のコマンドを実行し、各コマンドで表示されるすべてのヘルプ ページをよく読んでください。

  • call /?... 説明します%~2(引用符を囲まない 2 番目の引数)。
  • cmd /?... 二重引用符が必要な場合は、最後のヘルプ ページで説明しています。
  • icacls /?
  • md /?
  • rem /?
  • set /?
于 2016-10-18T17:22:46.397 に答える