0

最後の質問では、新しい大衆ユーザー作成スクリプトにどのように取り組んでいるかについて話し合い、現在は約95行になっています。私はその質問に対する解決策を受け取り、それをコードの別のセクションに実装しようとしました。現在、ユーザーを作成するメインのforループにネストされたforループを使用して、Excelドキュメントから複数のグループにユーザーを追加しようとしています。メールでユーザーを有効にします。

今これは私が持っているものです:

setlocal enabledelayedexpansion
for /f "skip=37 tokens=* delims=," %%a in (Settings.ini) do (
set Groups=%%a
)


for /f "skip=1 Tokens=1,2,3 Delims=," %%a in (C:\UserList.csv) do (
set User=%%a
set "GroupsAdd=net group %groups:,= /add !User! && net group %"
!GroupsAdd! /add %%a
)

ご覧のとおり、スクリプトは設定ファイルの37行をスキップして、目的の行に到達し、groups変数をその行に設定します。次のforループは、設定ファイルで定義された指定されたグループ(Students、StudentProxy、Year12など)にユーザーを追加しようとします。

ここでコードが失敗し、ネットグループのヘルプメニューが表示されます。遅延拡張を使用しないなど、他のことを試しましたが、次のようなエラーが発生しました。

/Add is not recognised as an internal or external command, operable program or batch file.

どんな助けでも大歓迎です。

TL; DRネットグループを使用して、Excelファイルのユーザーを設定ファイルの指定されたグループに追加する関数を作成する必要がありますが、現在の方法は継続的に失敗し、助けが必要です。

4

1 に答える 1

2

!s は遅延展開に使用されることに注意してください。つまり、s で区切られた式は、!s で区切られた式よりも後で展開されるはず%です。

現在のコードでは、!区切り式が区切り式の中に置かれてい%ます。このようにして、前者には展開する機会が与えられません。

  • 展開はより早く行われ、%展開が行われる特定の時点では、!s は処理されず、特別な記号として認識されません。そのため、/add !User! && net group %ビットは展開せずにそのまま挿入され!User!ます。

  • 後で全体を展開するGroupsAddと、その!中の s は再び機能しなくなります。これらを展開する時間は、後でGroupsAddではなく、正確に が展開されているときだからです。つまり、s は再帰的に展開されません。!

ここに 2 つのオプションがあります。

  1. !GroupsAdd! /add %%aをサブルーチンに入れ、!s を%s と%%aに置き換え%User%ます。

    ...
    for /f "skip=1 Tokens=1,2,3 Delims=," %%a in (C:\UserList.csv) do (
    set User=%%a
    set "GroupsAdd=net group %groups:,= /add !User! && net group %"
    call :GroupsAdd
    )
    goto :EOF
    :GroupsAdd
    %GroupsAdd% /add %User%
    
  2. User変数を削除し、コマンドset GroupsAddで を に置き換え、展開を次の!User!ように置き換えます。%%a%!

    ...
    for /f "skip=1 Tokens=1,2,3 Delims=," %%a in (C:\UserList.csv) do (
    set "GroupsAdd=net group !groups:,= /add %%a && net group !"
    !GroupsAdd! /add %%a
    )
    
于 2013-03-09T11:28:01.857 に答える