我正在尝试使用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来找到一种动态更新本地网页的方法,而无需刷新页面,但一次只能执行一次。
答案 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
$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。