Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批次和每个条目_Batch File_For Loop_Wmic - Fatal编程技术网

Batch file 批次和每个条目

Batch file 批次和每个条目,batch-file,for-loop,wmic,Batch File,For Loop,Wmic,我们需要一个批处理脚本来查看哪些映射已经处于活动状态,删除映射并使用新密码重新映射一次 我有以下代码示例: @echo off set server=srv1 for /f "tokens=1,2*" %%a in ('wmic logicaldisk get Caption^, providername^| find /I "%server%"') do ( for /f "tokens=1,2*" %%d in ("%%a") do ( echo net us

我们需要一个批处理脚本来查看哪些映射已经处于活动状态,删除映射并使用新密码重新映射一次

我有以下代码示例:

@echo off
set server=srv1

for /f "tokens=1,2*" %%a in ('wmic logicaldisk get Caption^, providername^| find /I "%server%"')  do ( 
    for /f "tokens=1,2*" %%d in ("%%a") do ( 
        echo net use %%a /del 
        for /f "tokens=1,2*" %%e in ("%%a", "%%b") do (
            echo net use %%a %%b /user:dom/uid1 pwd
        )
    )
)        
问题是我需要先删除所有映射,然后再重新映射

我当前的代码是:删除,重新映射,删除,重新映射


有人能帮我介绍一下我的代码示例吗?

要做您想做的事情,您需要将当前映射存储到somwhow。我会在类似数组的环境变量中这样做,例如
$MAP[1]
$MAP[2]
。由于
Caption
属性似乎总是一个驱动器号加冒号,而
ProviderName
属性似乎总是一个UNC路径,因此变量
$MAP[1]
可能包含类似
|
的内容

因此,让我们建立两个独立的循环,其中第一个循环执行删除和数据存储,第二个循环执行重新映射活动,例如:

@echo关闭
设置“服务器=srv1”
rem//初始化索引计数器:
设置/A“计数=0”
rem/*捕获由“where”子句过滤的“wmic”命令行的输出;
rem这只返回经过网络驱动器过滤的驱动器(`DriveType=4`);
rem两个嵌套循环避免了像孤立CR标记这样的文本转换人工制品:*/
对于/F“delims=”%%K in('
wmic LogicalDisk,其中“DriveType=4,ProviderName(如'\\\\\\%SERVER%\\\\%%')获取设备ID/值
“)do for/F”标记=1*delims==”%%I in(“%%K”)do(
rem/*捕获返回映射目标的“wmic”命令行的输出
与当前驱动器对应的rem:*/
对于/F“delims=”%%G in('
wmic LogicalDisk,其中“DeviceID='%%J'”获取ProviderName/VALUE
“)do for/F”标记=1*delims==”%%E in(“%%G”)do(
rem//增量索引计数器:
设置/A“计数+=1”
rem//wmic对`&`的还原处理,因此将`&`替换为`&`:
设置“名称=%%F”&调用设置“名称=%%名称:&;=&%%”
rem/*将当前映射存储到类似数组的变量中;
修改“COUNT”时,`%%COUNT%%`中的rem`call`和double-`%%`是必需的
rem和read在同一代码块中(`COUNT%`将返回`0`):*/
调用集“$MAP[%%COUNT%%]=%%J |%%NAME%%”
rem//删除当前映射:
回声网使用%%J/删除
)
)
rem//在所有数组元素上循环:
对于/F“tokens=1-2*delims=|=”%%H in('2^>numset$MAP[')do(
rem//使用新用户数据建立重新映射:
回声网使用%%I“%%J”pwd/用户:dom/uid1
rem//删除处理过的数组元素:
设置“%%H=”
)
当然,您需要首先设置和调整过滤器变量
SERVER
(用于
where
子句,它取代了
find
命令)。我将搜索字符串更改为
\\%SERVER%\
,因此只匹配完整的服务器名称

此方法正确处理包含空格和符号(
&
)的网络路径


要实际删除并重新映射远程路径,请删除大写的
ECHO
命令。

非常感谢您! Scipt运行得非常好!如果连接到多个域,我又添加了一个关于
cmdkey
的部分来处理用户/PWD。最后是我的compl Scipt:

@echo off
::# ------------------------------------------------------------------
::# specify Server Name (FQDN or IP Adresse)
::# IP: 10.0.0.1
::# FQDN: srv1.foo.bar
::# ------------------------------------------------------------------
set SERVER=10.0.0.1
::#
::# ------------------------------------------------------------------
::# delete old mappings for Server
::# ------------------------------------------------------------------
rem // Initialise index counter:
set /A "COUNT=0"
rem /* Capture output of the `wmic` command line that is filtered by a `where` clause;
rem    this returns only the drives, filtered for network drives (`DriveType=4`);
rem    two nested loops avoid text conversion artefacts like orphaned CR marks: */
for /F "delims=" %%K in ('
    wmic LogicalDisk where "DriveType=4 and ProviderName like '\\\\%SERVER%\\%%'" get DeviceID /VALUE
') do for /F "tokens=1* delims==" %%I in ("%%K") do (
    rem /* Capture output of the `wmic` command line that returns the mapping target
    rem    that corresponds with the current drive: */
    for /F "delims=" %%G in ('
        wmic LogicalDisk where "DeviceID='%%J'" get ProviderName /VALUE
    ') do for /F "tokens=1* delims==" %%E in ("%%G") do (
        rem // Increment index counter:
        set /A "COUNT+=1"
        rem // Revert handling of `&` by `wmic`, hence replace `&` by `&`:
        set "NAME=%%F" & call set "NAME=%%NAME:&=&%%"
        rem /* Store current mapping into array-like variable;
        rem    `call` and double-`%` in `%%COUNT%%` are necessary as `COUNT` is modified
        rem    and read within the same block of code (`%COUNT%` would return `0`): */
        call set "$MAP[%%COUNT%%]=%%J|%%NAME%%"
        rem // Delete the current mapping:
        net use %%J /DELETE
        cmdkey /delete:%SERVER%
    )
)
::#
::# ------------------------------------------------------------------
::# Get User Information
::# ------------------------------------------------------------------
set /p U-ID=Bitte U-ID eingeben: 
set /p Pwd=Bitte das NEU vergebene Passwort eingeben: 
::#
::# ------------------------------------------------------------------
::# New mappings for Server
::# ------------------------------------------------------------------
rem // Loop over all array elements:
for /F "tokens=1-2* delims=|=" %%H in ('2^> nul set $MAP[') do (
    rem // Establish remapping with new user data:
    cmdkey /add:%SERVER% /user:%U-ID%@foo.bar /pass:%PWD%
    net use %%I "%%J" /PERSISTENT:YES
    rem // Delete handled array element:
    set "%%H="
)
当然,cmdkey会在服务器时间运行,但这没关系。 非常感谢你的帮助!
BEST regrads AxelF

您几乎可以运行3个循环,这可以用一个循环完成。这是怎么回事?请在下面给出我的答案。请在这里具体说明。您是要检查所有映射的驱动器并重新映射它们,还是要指定一个映射并重新映射?我建议您首先运行以下命令,
WMIC-Net获取LocalName、RemoteName、UserName
,希望它们能为您提供重新映射所需的解析信息。当然,您可以尝试在批处理文件
for
循环中使用它,将信息保存为变量。一个未经测试的示例可能是
('WMIC NetUse Where“远程路径类似于“\\\\srv1\\%%”和UserName='dom\\uid1'”Get LocalName^,RemotePath^ Find/V”“”)
,但您可能需要使用它来输出所需内容!感谢您在没有给出任何理由的情况下进行否决投票!!忘记我的帖子!!这是我的错!来自aschipfl的代码100%有效!非常感谢您的帮助,一切都很好。wrbrgds AxelFOK非常感谢您删除我尝试做的评论下一次。还有一个问题,如果目录路径中有一个空格,如
\\srv1\shared folder
,会发生什么?非常感谢大家!如果出现空格,如
\\srv1\shared folder
,脚本只使用
\\srv1\shared
;如果您也需要处理空格,请告诉我,然后我会相应地更新脚本……是的实际上,我们有一个目录,其中有一个空格。我尝试将代码从
for/F“tokens=1,2”
更改为
for/F“tokens=1,2*”
并添加
调用集“$MAP[%%COUNT%%]=%%I |%%J”
调用集“$MAP[%%COUNT%%]]]=%I |%%J%%K”
,该调用集显示了完整的路径,但我用空格括起来:-(