2016-10-17 1 views
1

おはよう。icaclsに外部変数を渡すときに奇妙な問題があります

私はバッチスクリプトに問題があります。私はそれに変数を与えるプログラムを持っていて、その変数を使ってフォルダを作成し、その上に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の欠点ですか?

おかげ

+0

% 2は、スペースを含むことができますか?エコーでその値を確認してください。 %path%と%username%を大括弧( "%path")で囲んでみてください。 – alexander

+0

ねえ、私はテキストファイルに出力します。\\ example \ shares \ Student \ "16137" "というパス変数の結果です。ユーザー名は" 16137 "となります。 – MattMack

+0

大括弧で囲まれていますか? - (%path%)と( %username%) – MattMack

答えて

1

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

事前定義された環境変数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 /?
+0

私はあなたの情報を調べて練習しています。私はおそらくあなたが知ることができる最高のプログラマーではありません。あなたのスクリプトは完璧に動作しました。変数の見積もりは非常に便利です。 – MattMack

+0

私は%path%と%username%から遠ざかります。彼らが働いているのは面白いです。これらのEVを上書きすることは大きな問題を引き起こす可能性があります。 – MattMack

+0

私はまもなく同様のスクリプトを作成しなければならないので、次のスクリプトでもっとうまくいくでしょう。どうもありがとうございました。 – MattMack

関連する問題