我使用Powershell(.ps1)脚本扫描物理应用程序和Web服务器,以识别与我们的应用程序相关的配置文件,这些文件中包含硬编码的IP地址。
我正在执行脚本并收到错误的Windows服务器的Powershell版本-1.0。
我正在"您无法在空值表达式上调用方法"
方案是:在我的本地物理机上运行脚本运行正常,但是,在我的应用服务器上运行它会给我上述错误。
$itemsFromFolder = Get-ChildItem -path $drive -include *.txt, *web.config, *.htm, *.html, *.asp, *.ascx, *.aspx, *.xml, *.js, *.css, *.sql -recurse -errorAction SilentlyContinue
Write-host -message "initializing object"
$itemsToScan = New-Object System.Collections.Generic.List[string]
Write-host -message "initializing object $itemsToScan
foreach($item in $itemsFromFolder)
{
$itemsToScan.Add($item.FullName)
#Write-host -message "itemstoscan loop $itemsToScan"
}
我正在为System.Collections.Generic.List [string]实例化一个对象,该对象将包含在变量$ itemstoscan中,该变量将包含要扫描我提供的IP模式的项目。
问题:
$itemsToScan = New-Object System.Collections.Generic.List[string]
这是在powershell 1.0中实例化对象的正确方法,这限制了我在不同配置的机器上运行相同的脚本吗?
$itemsToScan.Add($item.FullName)
我在App服务器上评估此表达式时遇到错误,该服务器在我的本地运行正常。
答案 0 :(得分:3)
在Powershell v1中没有“开箱即用”的支持来创建泛型类型(读取:你在v1中使用的是v2语法)。
$itemsToScan = New-Object System.Collections.Generic.List[string]
会在Powershell v1中抛出异常,变量itemToScan
将为$null
。作为一种解决方法,您可以使用New-GenericObject。
答案 1 :(得分:1)
我怀疑你可以更容易地达到预期效果:
$itemsFromFolder = Get-Childitem -path $drive -include *.txt, *web.config, *.htm, *.html, *.asp, *.ascx, *.aspx, *.xml, *.js, *.css, *.sql -recurse -errorAction SilentlyContinue
$itemsToScan = $itemsfromfolder | Select-Object FullName
使用PowerShell,您不应再费心提取字符串值,而是利用传递实际对象的优势。