PowerShell:我需要理解为什么参数被解释为NULL

时间:2013-01-10 15:17:24

标签: powershell nullreferenceexception file-rename

我收到一个错误,我无法在null值表达式上调用方法。但是,我不确定为什么参数导致空值。我需要第二眼看这个并给我一些指导。

$docpath = "c:\users\x\desktop\do"
$htmPath = "c:\users\x\desktop\ht"
$txtPath = "c:\users\x\desktop\tx"
$srcPath = "c:\users\x\desktop\ht"
#
$srcfilesTXT = Get-ChildItem $txtPath -filter "*.htm*"
$srcfilesDOC = Get-ChildItem $docPath -filter "*.htm*"
$srcfilesHTM = Get-ChildItem $htmPath -filter "*.htm*"
#
function rename-documents ($docs) {  
    Move-Item -txtPath $_.FullName $_.Name.Replace("\.htm", ".txt") 
    Move-Item -docpath $_.FullName $_.Name.Replace("\.htm", ".doc") 
}
ForEach ($doc in $srcpath) {
    Write-Host "Renaming :" $doc.FullName         
    rename-documents -docs  $doc.FullName   
    $doc = $null   
}

错误......

You cannot call a method on a null-valued expression.
At C:\users\x\desktop\foo002.ps1:62 char:51
+     Move-Item -txtPath $_.FullName $_.FullName.Replace <<<< ("\.htm", ".txt")
    + CategoryInfo          : InvalidOperation: (Replace:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.
At C:\users\x46332\desktop\foo002.ps1:63 char:51
+     Move-Item -docpath $_.FullName $_.FullName.Replace <<<< ("\.htm", ".doc")
    + CategoryInfo          : InvalidOperation: (Replace:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

首先:看来我的("\.htm", ".txt")显示为null。我在没有\ - (".htm", ".txt")的情况下尝试了它,并收到了相同的结果。

第二:在语法上,我将我的行解释为move-item <path> <source-file-passed-to-function> <replacement=name-for-file> (parameters-for-replacement)。这是对这段代码的作用的恰当理解吗?

第三:我是否需要在某处拥有-literalpath参数? MS TechNet和get-help几乎没有关于-literalpath参数用法的信息;我无法找到与我的特定情况相关的东西。

帮助我理解我所缺少的东西。谢谢!

1 个答案:

答案 0 :(得分:3)

在简单函数的上下文中,$_未定义。 $_仅在管道中有效。也就是说,$_表示当前传递给管道的对象。

使用您当前的功能定义,请尝试这种方式:

function Rename-HtmlDocument([System.IO.FileInfo]$docs, $newExt) {  
    $docs | Move-Item -Dest {$_.FullName -replace '\.htm$', $newExt} 
}

您可以直接将$srcfilesDOC$srcFilesTXT变量传递给此函数,例如:

Rename-HtmlDocument $srcFilesDOC .doc
Rename-HtmlDocument $srcFilesTXT .txt

当然,您可以使其更通用,并从FileInfo对象获取源扩展名,例如:

function Rename-DocumentExtension([System.IO.FileInfo]$docs, $newExt) {  
    $docs | Move-Item -Dest {$_.FullName.Replace($_.Extension, $newExt)} 
}

BTW PowerShell的Move-Item命令没有您使用的参数-txtPath-docPath。这是你创建的一个功能吗?