1

null 値の式でメソッドを呼び出せないというエラーが表示されます。ただし、パラメーターが null 値になる理由はわかりません。これを見て、いくつかのガイダンスを与えるために、2番目の目が必要です。

$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

最初: my("\.htm", ".txt")が null として表示されているようです。\--なしでも試してみましたが(".htm", ".txt")、同じ結果が得られました。

2 番目: 構文的に、私は自分の行を として解釈していmove-item <path> <source-file-passed-to-function> <replacement=name-for-file> (parameters-for-replacement)ます。このコードが何をしているのかを正しく理解していますか?

3 番目:-literalpathどこかにパラメーターが必要ですか? -literalpathMS TechNet と get-help には、パラメーターの使用に関する情報がほとんどありません。自分の特定の状況に関連するものを見つけることができませんでした。

私が欠けているものを理解するのを手伝ってください。ありがとう!

4

1 に答える 1

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

ところで、PowerShell の Move-Item コマンドには、使用しているパラメーター-txtPath-docPath. これはあなたが作成した関数ですか?

于 2013-01-10T15:47:03.580 に答える