脚本在PS3中工作但在PS2中没有,我找不到确切的错误“Bad Argument to operator'-gt'

时间:2013-12-23 09:35:10

标签: powershell powershell-v2.0 powershell-v3.0

我的脚本找到大于x的文件对我和我的powershell 3.0很好。但是在我们的服务器上我们只有PowerShell 2.0而且我无法正常工作。

错误如下:

Bad Argument to Operator '-gt' Could not compare "3841" to "10MB". Error cannot convert "10MB" to type "System.Int64" Error: "Input string was not in a correct format."".

我的脚本在这里,我试图将10MB的值更改为“10”但是我认为它与kb相比。那不是我想要的!有什么想法吗?

Param(
  [ValidateScript({test-path -path $_ -pathtype container})]
  [string]$targetfolder,
  [string]$size
)

function getfilesbigger 
{
$colItems =  (get-childitem  "$targetfolder" -recurse | where {$_.length -gt "$size" } | tee-object -variable allfiles | measure-object -property length -sum)
$allfiles | foreach-object {write-host $_.FullName ("{0:N2}" -f ($_.Length / 1MB)) "MB" -ForegroundColor "green" }
write-host "Collected all files bigger than $size from folder $targetfolder " -foregroundcolor "darkgreen"
"Number of files: "+ $colItems.count + [Environment]::NewLine + "Size of all files "+"{0:N2}" -f ($colItems.sum / 1MB) + " MB" 
}

getfilesbigger

1 个答案:

答案 0 :(得分:2)

原因是size已明确定义为字符串:

Param(  ...   
[string]$size)

因此,Powershell不会像往常一样自动将10mb转换为整数10485760,而是将其用作字符串。对于工作版本,只需像这样使用int,

Param(
  [ValidateScript({test-path -path $_ -pathtype container})]
  [string]$targetfolder,
  [int]$size
)

修改

它适用于我的2.0环境。尝试添加.GetType()电话,看看发生了什么。像这样,

function getfilesbigger 
{
$size.gettype()
$colItems = ...

gettype调用的结果应该是

IsPublic IsSerial Name                BaseType
-------- -------- ----                --------
True     True     Int32               System.ValueType

你得到了什么?