【问题标题】:Need a loop for computer names on shares需要一个循环来获取共享上的计算机名称
【发布时间】:2021-08-31 14:32:39
【问题描述】:

我有这个尴尬的.bat:

pushd \\computer00081\d    
rmdir "z:\dig_dok" /s /q   
mkdir . "dig_doc"   
cd dig_doc  
xcopy "C:\Users\myUser\Desktop\dig_doc" .\ /E  
C:  
net use z: /delete /y

我网络上的计算机名称共享相同的名称模式: 计算机00081、计算机00082、计算机00083……等等。它们在“d”共享中具有相同的文件/文件夹结构。 如何为计算机名称创建一个循环,例如从 computer00001 到 computer00200 并对所有计算机执行相同操作?也许是为computers.txt 列表做的?或者从主机文件中循环它们。提前致谢!你摇滚!

【问题讨论】:

    标签: for-loop batch-file cmd


    【解决方案1】:

    虽然这可以在cmd 中使用,但在powershell 中更容易。 for 循环控制系统编号;在这种情况下从 1 到 9。将它们更改为您需要的任何内容。如果您对将要完成的操作感到满意,请从 Remove-Item 和 `Copy-Item 命令中删除 -WhatIf

    === Do-CopyStuff.ps1

    $DupDir = 'dig_doc'
    $SourceDir = Join-Path -Path (Join-Path -Path $Env:USERPROFILE -ChildPath 'Desktop') -ChildPath $DupDir
    $SHARENAME = 'D'
    for ($i = 1; $i -lt 10; $i++) {
        $DestinationDir = '\\COMPUTER' + '{0:d5}' -f @($i) + "\$SHARENAME"
        if (Test-Path -Path $DestinationDir) {
            Remove-Item -Recurse -Force -Path $DestinationDir -WhatIf
            Copy-Item -Recurse -Path $SourceDir -Destination $DestinationDir -WhatIf
        }
    }
    

    如果您必须从cmd.exe 运行它,则可以使用它。

    powershell -NoLogo -NoProfile -File ".\Do-CopyStuff.ps1"
    

    【讨论】:

    • 哟! Ur s#!t 真的很火!正是我需要的。我为 $DestinationDir 做了一个 \$SHARENAME\$DupDir" 并做了一个 $PushdDir = '\\COMPUTER' + '{0:d5}' -f @($i) + "\$SHARENAME" 所以我可以运行另一个“if (Test-Path -Path $PushdDir) { pushd $PushdDir} 先推送共享,否则它不会找到未映射的网络位置。但是,嘿,你帮了很多忙。你现在是我个人的上帝! /弓
    • 在 PowerShell 中,pushd 是 Push-Location。但是,我认为你不需要它。 UNC 路径可以引用该目录。此外,Push-Location 不映射驱动器号。在cmd 中,您不能假设pushd 映射到Z:。执行此操作不需要驱动器号。
    【解决方案2】:

    看看这个答案:https://stackoverflow.com/a/8086103/8954127

    如果有可用的常用分隔符(如,),看起来字符串变量在 cmd 中自然是可迭代的。如果您能够构建以逗号分隔的计算机名称字符串,则可以在每个主机上循环执行它们。

    这个答案不完整,但我认为这应该会激励你朝着正确的方向前进。

    set "compnames="
    
    :: needs extra logic to pad missing leading zeros
    for /L %%i in (1,1,20) do call set "compnames=%compnames%,computername00%%i"
    
    :: logic to remove any leading comma or space
    
    for %%i in ( %compnames% ) do (
        :: do work with each computer name
        echo %%i
    )
    

    更多参考资料:

    【讨论】:

    • 有没有办法遍历一个包含所有计算机名称的computers.txt 列表?
    • 是的!查看FOR /F 文档:ss64.com/nt/for_f.html 这可以打开一个文件并循环遍历文本文件中的行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2022-07-14
    • 1970-01-01
    • 2013-06-07
    • 2011-05-03
    相关资源
    最近更新 更多