Нужен цикл для имен компьютеров на общих ресурсах

У меня есть этот смущающий .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 и сделать то же самое для всех из них? Может быть, сделать это для списка компьютеров.txt? Или зациклить их из файла hosts. Заранее спасибо! Ты жжешь!


person Sv3n    schedule 15.06.2021    source источник


Ответы (2)


В то время как в cmd это может быть куполом, в powershell это намного проще. Цикл for управляет системными номерами; в данном случае от 1 до 9. Измените их на то, что вам нужно. Когда вы будете довольны результатом, удалите -WhatIf из команд Remove-Item и `Copy-Item.

=== 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"
person lit    schedule 15.06.2021
comment
Эй! Ур s#!t's действительно горит fam! Именно то, что мне было нужно. Я сделал \$SHARENAME\$DupDir для $DestinationDir и создал $PushdDir = '\\COMPUTER' + '{0:d5}' -f @($i) + \$SHARENAME, чтобы я мог запустить другой, если ( Test-Path -Path $PushdDir) { pushd $PushdDir}, чтобы сначала отправить общий ресурс, иначе он не найдет такое сетевое расположение, которое не отображается. Но эй вы были тонны помощи. Ты теперь мой личный бог! /лук - person Sv3n; 16.06.2021
comment
В PowerShell pushd — это Push-Location. Но, я не думаю, что вам это нужно. На каталог можно ссылаться по пути UNC. Кроме того, Push-Location не сопоставляет букву диска. В cmd вы не можете предположить, что pushd отображается на Z:. Для этого не нужны буквы дисков. - person lit; 16.06.2021

Посмотрите этот ответ: 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
)

Еще несколько ссылок:

person Grant Lindsey    schedule 15.06.2021