gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:20:50 25 4
gpt4 key购买 nike

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

$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参数的使用的信息。我找不到与我的特定情况有关的东西。

帮助我了解我所缺少的。谢谢!

最佳答案

在简单函数的上下文中,未定义$_$_仅在管道中有效。就是说,$_代表了流经管道的当前对象。

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

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的参数。这是您创建的功能吗?

关于powershell - PowerShell:我需要理解为什么参数被解释为NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14261137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com