Запись в файл .js с помощью PowerShell - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь записать в файл .js на основе содержимого текстового файла (C: \ instalApps.txt), используя PowerShell.

Файл installedApps.txt содержит имя и версиюустановленные приложения на компьютере - я хочу найти installedApps.txt для имени и версии приложения, и результат присваивается переменным $findAppName и $findAppVer соответственно.

Затем я хочу записать в.файл js, если командлету Select-String удалось сопоставить аргументы $appName и $appVer, переданные в функцию Check-Install.См. Код ниже:

function Check-Install ([string]$appName, [string]$appVer) {

  $findAppName = Get-Content C:\installedApps.txt | Select-String $appName
  $findAppver = Get-Content C:\installedApps.txt | Select-String $appVer

  if ($findAppName -and $findAppVer -eq $true) {
   Set-Content -path $jsFile -Value "var row = getElementById('row-1'); 
   row.classList.add('hidden');"    
   } else { 
     write-host Match Not Found
   }
}

Check-Install -appName "Cisco AnyConnect Secure Mobility Client" -appVer "4.6.01103"

Переменные $findAppName и $findAppVer ничего не возвращают, но не уверены, в чем я ошибаюсь - командлет Select-String должен принимать переменные (?).

Примечание. В оболочке не возникает ошибок

ОБНОВЛЕНИЕ:

Вот пример того, как форматируется установленный журналApps.txt:

DisplayName     : 7-Zip 18.05 (x64)
Publisher       : Igor Pavlov
InstallDate     : 
DisplayVersion  : 18.05
UninstallString : C:\Program Files\7-Zip\Uninstall.exe

DisplayName     : Adobe Flash Player 31 NPAPI
Publisher       : Adobe Systems Incorporated
InstallDate     : 
DisplayVersion  : 31.0.0.122
UninstallString : 
C:\WINDOWS\SysWOW64\Macromed\Flash\FlashUtil32_31_0_0_122_Plugin.exe - 
maintain plugin

DisplayName     : Adobe Flash Player 31 PPAPI
Publisher       : Adobe Systems Incorporated
InstallDate     : 
DisplayVersion  : 31.0.0.122
UninstallString : 
C:\WINDOWS\SysWOW64\Macromed\Flash\FlashUtil32_31_0_0_122_pepper.exe - 
maintain pepperplugin

DisplayName     : Cisco AnyConnect Secure Mobility Client
Publisher       : Cisco Systems, Inc.
InstallDate     : 20180906
DisplayVersion  : 4.6.01103
UninstallString : MsiExec.exe /X{58524593-122C-43F0-96E2-A6BCC42E3412}

Я хочу инициировать установку / удаление приложения (без использования объекта WMI, поскольку, как я прочитал, это занимает некоторое время и может вызвать восстановление установки по запросу) и запись на локальную веб-страницу на основерезультаты $ findApp через файл .js показывают, установлено ли приложение или нет.

Я пытаюсь создать сценарий обновления программного обеспечения с интерфейсом, написанным на HTML, CSS и JavaScript дляUI.Сценарий будет запускаться при входе на несколько компьютеров в домене.Мне нужно будет использовать Ajax, чтобы найти способ динамического обновления локальной веб-страницы без обновления страницы, но по одному шагу за раз.

1 Ответ

0 голосов
/ 26 ноября 2018

Попробуйте следующее:

Обратите внимание, что предполагается, что строки входного файла *.txt содержат имя приложения до номера версии, но это легко изменить.

function Check-Install ([string]$appName, [string]$appVer) {

  if (Select-String -Quiet -Pattern (
         '\b{0}\b{1}\b' -f [regex]::Escape($appName), [regex]::Escape($appVer)
       ) -LiteralPath C:\installedApps.txt
  ) { # if
    Set-Content -path $jsFile -Value "var row = getElementById('row-1');
    row.classList.add('hidden');"
  } else {
     write-host 'No match.'
  }

}

Check-Install -appName "Cisco AnyConnect Secure Mobility Client" -appVer "4.6.01103"
  • Select-String -Quiet выводит только значение [bool], которое отражает в реферате, соответствует ли шаблон (хотя бы) одной строке.

  • [regex]::Escape() используется для экранирования имени и версии приложения для использования в регулярном выражении, поэтому при сопоставлении они рассматриваются как литералы .

  • '\b{0}\b{1}\b' -f ...строит одно регулярное выражение (строку) из экранированных значений для поиска обоих значений в строке с одинаковой , используя утверждение \b, чтобы убедиться, что они совпадают только на границах слов (а нетакже внутри больших слов).

  • Обратите внимание, как Select-String может напрямую принимать операнд имени файла через параметры -LiteralPath или -Path, что является одновременно более коротким и эффективным.


Что касается то, что вы пытались :

$findAppName = Get-Content C:\installedApps.txt | Select-String $appName
$findAppver = Get-Content C:\installedApps.txt | Select-String $appVer
  • Вы ищете имя и версию отдельно , что означает, что вы можете найти соответствие для номера версии, которая относится кнапример, другое приложение.

  • $findAppName и $findAppver либо "ничто" (эффективно, $null), если совпадение не найденоили экземпляры типа [MatchInfo]

$findAppName -and $findAppVer -eq $true
  • Как указано, эти переменные не являются логическими значениями, поэтому сравнивать их с -eq с $true бессмысленно.

Кроме того, из-за приоритета оператора PowerShell ваш оператор будет проанализирован как $findAppName -and ($findAppVer -eq $true), то есть явное -eq сравнение применяется только к переменной second , которая в вашем случае всегда возвращает $false.

.вы могли бы полагаться на неявную булеву логику PowerShell [1] (оставляя проблему поиска терминов отдельно):

$findAppName -and $findAppVer

Это оценило бы к $true, если бы оба $findAppName и $findAppVer содержали [MatchInfo] экземпляров, т. Е. Если бы оба вызова Select-String нашли хотя бы 1 совпадение.


[1] Сводная информация о неявной логике преобразования PowerShell в булево преобразование приведена в в этом ответе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...