使用PowerShell写入.js文件

时间:2018-11-25 19:09:18

标签: powershell

我正在尝试使用PowerShell根据文本文件(C:\ installedApps.txt)的内容写入.js文件。

import { Component } from '@angular/core'; import { IonicPage, NavController, NavParams } from 'ionic-angular'; import { BarcodeScanner, BarcodeScannerOptions } from '@ionic-native/barcode-scanner'; @IonicPage() @Component({ selector: 'page-scan', templateUrl: 'scan.html', }) export class ScanPage { options: BarcodeScannerOptions; scannedData:any={}; constructor(public navCtrl: NavController, public navParams: NavParams, public scanner: BarcodeScanner) {} ionViewDidLoad() { console.log('ionViewDidLoad ScanPage'); } scan(){ this.options={ prompt: 'Scan your barcode' }; this.scanner.scan(this.options).then((data)=>{ this.scannedData = data; }, (err)=>{ console.log('Error:',err); }) } } 文件包含计算机上已安装应用程序的名称和版本-我想在installedApps.txt中搜索应用程序名称和版本,并将结果分配给installedApps.txt和分别是$findAppName个变量。

然后,如果Select-String cmdlet成功匹配传递给Check-Install函数的$findAppVer$appName参数,我想写一个.js文件。参见下面的代码:

$appVer

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变量没有返回任何内容,但是不确定我要去哪里— Select-String cmdlet应该接受变量(?)。

注意:Shell中不会抛出任何错误

更新:

下面是一个如何格式化installedApps.txt日志的示例:

$findAppVer

我想触发应用程序的安装/卸载(不使用WMI对象,因为我已经读了一段时间,并且可以触发查询的安装修复),并根据$ findApp结果写入本地网页通过.js文件显示该应用程序是否已经安装。

我正在尝试创建一个软件更新脚本,其前端使用HTML,CSS和JavaScript编写用于UI。该脚本将在域中的多台计算机上的登录中运行。我将需要使用Ajax来找到一种动态更新本地网页的方法,而无需刷新页面,但一次只能执行一次。

1 个答案:

答案 0 :(得分:1)

尝试以下操作:

请注意,假设是*.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()用于转义用于正则表达式的应用程序名称和版本,以便在匹配时将它们视为 literal

  • '\b{0}\b{1}\b' -f ...使用断言{{从转义的值构建单个正则表达式(字符串),以在 same 行上查找 both 值。 1}},以确保它们仅在单词边界匹配(而在较大的单词内部不匹配)。

  • 请注意\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)(如果找不到匹配项)或类型为[MatchInfo]

$null
  • 如前所述,这些变量不是 Booleans ,因此将它们与$findAppName -and $findAppVer -eq $true -eq进行比较是毫无意义的。

除此之外,由于PowerShell operator precedence,您的语句将被解析为$true,即,显式$findAppName -and ($findAppVer -eq $true)的比较仅应用于 second 变量,在您的情况下,该变量总是 返回-eq

也就是说,您本可以依靠PowerShell的隐式布尔逻辑 [1] (不用再单独搜索这些术语了):

$false

如果$findAppName -and $findAppVer $true都包含$findAppName个实例,即,如果两个$findAppVer调用都位于,则此评估为[MatchInfo]至少1场比赛。


[1]有关PowerShell隐式到布尔转换逻辑的摘要,请参见this answer