草庐IT

arrays - 在本地子网中查找可用设备名称并重命名设备

coder 2024-06-14 原文

这是一个相当复杂和令人讨厌的情况,我正在努力解决,所以我会尽量简化。

情况:我的组织对远程站点的 Windows PC 使用基于站点的命名约定。这些站点不在域中。命名约定如下:

(Site ID)-(Device Purpose)(Device Number)-(Device Model)

站点 ID 限制为 5 个字符。 设备用途限制为 2 个字符。 设备型号限制为 4 个字符。

因此,示例设备名称可能如下所示:

ABCDE-FG12-9876

问题:由于规划不当,许多设备错误地重复了名称的(设备编号)元素。因此,使用上面的示例,我可能在站点 ABCDE 有两个设备都命名为 ABCDE-FG12-9876 .我需要解决这个问题,而不必手动接触每台设备。

计划:我正在编写一个 PowerShell 脚本,我想执行以下操作:

  1. 根据当前机器的 IP 地址确定站点的/24 子网。
  2. 使用该子网 ping 该子网上所有事件的 Windows 机器并将它们的机器名称放入一个数组中。
  3. 根据该数组中的数据,确定第一个未使用的可用(设备编号),重命名设备并重新启动。

问题:我已经到了构建数组并尝试检查其内容的地步,但由于我无法弄清楚的原因,它只是将机器的名称添加到脚本中运行于 到阵列,并且未正确添加站点子网中的其余计算机。我已经阅读了代码直到我的眼睛交叉,并尝试重新使用来自 StackOverflow 和其他网站的示例,但我觉得我只是在空转我的轮胎,却一事无成。

我当然愿意接受任何关于如何实现我的目标的替代想法,但作为引用,我的代码目前在下面 目前,我只是试图输出 $sitemachines 的内容到屏幕以验证是否正在捕获正确的信息。

Function Iterate-Subnet($Subnet) {  #in the format of "10.10.10."
    $arrIPs = @();$arrValid = @() #Creates 2 arrays, one to hold the IP
                                  #addresses and the other to hold confirmed
                                  #Windows machines
    For($x=1; $x -lt 254; $x++) {
        #Starting at 1 and incrementing to 254, each time building a new IP
        #address based on the subnet
        $IPAddress = $Subnet + $x;$arrIPs += $IPAddress
    }
    ForEach ($IPfound in $arrIPs) {
        $ping = Get-WMIObject -Class Win32_PingStatus -Filter "Address='$IPfound'" #Ping each IP address in the subnet
        If ($ping.StatusCode -eq "0") {
             #Attempt to connect to each online machine using WMI, this
             #confirms whether it's a Windows machine
             $checkOS = Get-WMIObject -Class Win32_OperatingSystem -ComputerName "$IPfound" -ErrorAction SilentlyContinue
             #Add this computer name to the valid array
             If ($checkOS -ne $null) {$arrValid += @($checkOS.CSName)}
        }
    }
    #Remove any duplicate entries, this accounts for any multihomed machines
    $arrValid = $arrValid | Select-Object -Unique
    #Return the valid array to any script you choose to call this function from
    return $arrValid 
}

#Split the computer name at the device position number
#and store the beginning and end into two variables
$computer = hostname
$cname1 = $computer.substring(0,8)
$cname2 = $computer.substring($computer.length -5,5)

#Find and define the site subnet for pingsweep
#referencing current machine IP Address
$getip = Test-Connection -ComputerName $computer -Count 1 
$ip = $getip.IPV4Address.IPAddressToString
$IPByte = $ip.Split(".")
$sitesub = ($IPByte[0]+"."+$IPByte[1]+"."+$IPByte[2]+".")

#build and retrieve the list of site machines
#from the function Iterate-Subnet
$sitemachines = Iterate-Subnet -Subnet "$sitesub"
Start-Sleep -s 30
$sitemachines.length
$sitemachines

最佳答案

我使用以下方法进行重命名,

$a = Import-Csv c:\ServerNames.csv -Header OldName, NewName
Foreach ( $Server in $a ) {Rename-Computer -ComputerName $Server.OldName -NewName $Server.NewName -DomainCredential Domain\username -Force -Restart}

现在这有它的缺点,因为你必须给它一个 CSV,但你把旧的名称/IP 地址放在第一列,把新的放在第二列并运行它。有更多的前期工作,但脚本中失败的逻辑更少。

关于arrays - 在本地子网中查找可用设备名称并重命名设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31125219/

有关arrays - 在本地子网中查找可用设备名称并重命名设备的更多相关文章

  1. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  3. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

    通过ruby​​koans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John

  4. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  5. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  6. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  7. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  8. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  9. arrays - 这是 Ruby 中 Array.fill 方法的错误吗? - 2

    这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]

  10. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

随机推荐