1

我正在使用 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 模式的项目。

问题:

  1. $itemsToScan = New-Object System.Collections.Generic.List[string]这是在 powershell 1.0 中实例化对象的正确方法吗,这限制了我在不同配置的机器上运行相同的脚本?

  2. $itemsToScan.Add($item.FullName)我在本地运行良好的应用服务器上评估此表达式时出错。

4

2 回答 2

3

在 Powershell v1 中创建泛型类型没有“开箱即用”支持(阅读:您在 v1 中使用 v2 语法)。

$itemsToScan = New-Object System.Collections.Generic.List[string]将在 Powershell v1 中引发异常,变量itemToScan将为$null. 作为一种解决方法,您可以使用New-GenericObject

于 2012-06-09T20:50:45.470 回答
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,您不必再费心提取字符串值,而是利用传递实际对象的优势。

于 2012-06-13T16:11:04.710 回答