2013-01-10 92 views
1

我收到一個錯誤,我無法在空值表達式上調用方法。但是,我不知道爲什麼參數導致空值。我需要第二個眼睛來看這個,給我一些指導。PowerShell:我需要理解爲什麼參數被解釋爲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")是什麼顯示爲空。我已經嘗試過,沒有\ - (".htm", ".txt") - 也收到了相同的結果。

第二:在句法上,我將我的行解釋爲move-item <path> <source-file-passed-to-function> <replacement=name-for-file> (parameters-for-replacement)。這是對這個代碼在做什麼的適當理解?

第三:我需要在那裏有一個-literalpath參數嗎? MS TechNet和get-help對使用-literalpath參數的信息很少;我無法找到與我的特定情況相關的內容。

幫助我瞭解我錯過了什麼。謝謝!

+0

第一:'$ srcpath'包含「c:\ users \ x \ desktop \ ht」作爲字符串而不是文件列表。第二:對於'move-item',這個 - >'-txtpath'是要移動的文件的名稱,而不是路徑。描述你的問題到底是什麼。 –

+0

第三:在'move-item'中需要'-literalpath'作爲您的先例問題http://stackoverflow.com/a/14259748/520612 –

+0

目標:我試圖將一批文件從* .foo重命名爲*。酒吧。重命名必須是腳本中的函數。該腳本已經設置了需要傳遞給該函數的路徑變量。 – dwwilson66

回答

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)} 
} 

順便說一句,PowerWhite的Move-Item命令沒有你使用的參數-txtPath-docPath。這是你創建的功能嗎?

+0

-txtPath和-docPath被SUPPOSED爲$ txtPath和$ docPath(如上定義),這是問題的一部分,我敢肯定。我將解決你的問題。看起來它可能適用於我,因爲我必須使用腳本。 – dwwilson66

+0

這裏是所有這一切開始:stackoverflow.com/a/14259748/520612現在,我正在尋找你的解決方案,RenameItem〜可能無法正常工作。 – dwwilson66

+1

沒有必要在'.Replace(「...」,「...」)中轉義點,在使用'-replace「...」,「...」'的時候,在第一個參數中是必需的,因爲它是視爲正則表達式。這也是爲什麼我更喜歡後者的原因,因爲你可以添加尾隨'$',因爲你的意思是隻替換擴展名(最後)。 – mousio

相關問題