【问题标题】:Powershell: Conditional change value within filePowershell:文件内的条件更改值
【发布时间】:2014-03-10 15:42:44
【问题描述】:

我正在编写一个 PS 脚本,该脚本对主机名是文件中的一行的每台机器执行以下操作

  1. 停止服务
  2. 检查 .ini 文件中的端口号
  3. 根据现有值有条件地更新端口号
  4. 启动服务

我很难理解第 3 步的语法: 如果“ServerPort=443”,将其更改为“ServerPort=444” ElseIf 'ServerPort=444',将其更改为 'ServerPort=443'

这是我目前所处的位置:

$servers = Get-Content 'C:\Servers.txt'

   foreach ($server in $servers){
   # stop service and wait.
   (get-service -ComputerName $server -Name SERVICENAME).stop

   # Logic to see string. Looking for "ServerPort=%". Detect if Server port is 444 or 443. If one, set to other

   # Get Port from config file
   $port = get-content C:\config.ini | Where-Object {$_ -like 'ServerPort=*'}
    # Conditionally update port

    IF ($port -eq "ServerPort=443")
    {
        # update to 444
    }
    ELSEIF ($port -eq "ServerPort=444")
    {
        # update to 443
    }
    ELSE
    {
        Write-Host "Value not detected within Param"
    }

    #start service
    (get-service -ComputerName $server -Name SERVICENAME).start
}

根据我在这里所做的,我认为语法必须重新打开文件,重新搜索该行然后更新它......通过网络时效率很低......也许有一个更合乎逻辑和简单的方法来解决这个问题?

非常感谢您的帮助!

-韦斯

【问题讨论】:

  • 您不能就地更新文件中的行。你必须将文件读入一个变量,修改那里的相关行,然后用变量的内容重写整个文件。
  • 您有我应该为此研究的特定功能吗?我有点犹豫要不要重写整个文件。
  • 文件不应该超过一两个 kb(希望如此),替换文件应该是没有问题的。只需将文件加载到内存,在内存中进行调整,然后将更正后的文件写回远程机器。
  • 我不知道你所说的“特定功能”是什么意思。这就是文件系统的工作方式。您可以将数据附加到文件中,但您不能在不重写整个文件的情况下在文件中间进行更改。
  • 配置文件总共大约 220 行。此外,我不知道如何将文件加载到内存中进行此操作?我只是将示例拼凑在一起来构建我的脚本:D

标签: powershell windows-services windows-server-2008-r2


【解决方案1】:

我重写了你的一些脚本。看看这个:

# Define the name of the service to stop/start
$ServiceName = 'wuauserv';
# Get a list of server names from a text file
$ServerList = Get-Content -Path 'C:\Servers.txt';

foreach ($Server in $ServerList){
    # Stop service and wait
    Get-Service -ComputerName $Server -Name $ServiceName | Stop-Service;

    # Logic to see string. Looking for "ServerPort=%". Detect if Server port is 444 or 443. If one, set to other

    # Read the config.ini file into $ConfigFile variable
    $ConfigFilePath = "\\$Server\c$\config.ini";
    $ConfigFile = Get-Content -Path $ConfigFilePath -Raw;

    if ($ConfigFile -match 'ServerPort=443')
    {
        # Change ServerPort to 444
        Set-Content -Path $ConfigFilePath -Value ($ConfigFile -replace 'ServerPort=443', 'ServerPort=444');
    }
    elseif ($ConfigFile -match 'ServerPort=444') {
        # Change ServerPort to 443
        Set-Content -Path $ConfigFilePath -Value ($ConfigFile -replace 'ServerPort=444', 'ServerPort=443');
    }
    else {
        Write-Host -Object ('Could not find matching ServerPort value in {0}' -f $ConfigFilePath);
    }

    Get-Service -ComputerName $server -Name $ServiceName | Start-Service;
}

【讨论】:

  • 好人!这太有帮助了!您错过了 Get-Content 行中的 ConfigFilePath 变量,但除此之外它看起来工作正常!非常感谢。
  • 知道了 - 我刚刚批准了编辑。谢谢你抓住它!很高兴它正在工作 :) 另一种方法是将函数编写为自包含函数,然后通过 PowerShell Remoting (WinRM) 将其部署到远程系统。
  • 是的,我可以看到它的价值,但我有点喜欢不必在服务器上运行任何东西来执行。再次感谢您的出色帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 2018-02-15
  • 2020-12-19
相关资源
最近更新 更多