【问题标题】:Rename file based on size in Powershell在 Powershell 中根据大小重命名文件
【发布时间】:2020-01-22 23:58:51
【问题描述】:

我正在尝试重命名现有文件夹中大于 5gb 的文件。当我运行脚本时没有任何反应,我不确定参数或重命名项是否不正确。非常感谢您的帮助

$Path="C:\tmp\NPI_Archive"

Get-ChildItem $Path

$FileSizeLimit = ((5GB) -As [int])
$File = $Path -As [System.IO.FileInfo]
If ($File.Length -gt $FileSizeLimit)
{
    Rename-Item $Path "$($File.DirectoryName)\$($File.BaseName)"-NewName "$($File.DirectoryName)\$($File.BaseName)\NPI_Import.csv”
} 

【问题讨论】:

  • NPI_Archive 是文件还是文件夹?
  • [1] 您的 $File 变量中没有文件。相反,它有一个目录。 ///// [2] 你的"$($File.DirectoryName)\$($File.BaseName)" 正在添加一个双精度\`in the directory name. the value comes back as c:\\tmp` 如果那里有真实路径。如果没有这样的路径,那么你会得到c:\tmp。 ///// [3] 目录在.Length 属性中没有任何值。你总是会从中得到零。 ///// [4] 您将5gb 转换为[int] 将不起作用,因为这对于标准int 来说太大了。你需要int64
  • 如果您要使用-As operator,请记住您需要为$null 实际测试结果 以查看转换是否成功。但是,通常情况下,如果您知道一个对象是(应该是)特定类型,您会使用cast operator(例如$File = [System.IO.FileInfo] $Path),如果不能进行强制转换,则会引发错误执行。

标签: powershell


【解决方案1】:

对于您的 $FileSizeLimit 变量,您尝试将 5GB 字节(5368709120)转换为 Int32(最大值为 2147483647)。由于它不适合,因此会引发InvalidCast 异常。将int 更改为doubleint64 应该可以解决它。

$FileSizeLimit = ((5GB) -As [double])

【讨论】:

  • 补充一点,使用-As 而不是直接强制转换实际上隐藏了问题。 5GB 不能转换为 [int],所以 (5GB) -As [int] 返回 $null 没有错误。 [int] 5GB 显式失败,但是,抛出带有消息 Cannot convert value "5368709120" to type "System.Int32". Error: "Value was either too large or too small for an Int32." 的异常,这使得问题很明显。在这种情况下,-As 不仅没有必要并且掩盖了问题,而且根本不需要强制转换;运行(5GB).GetType(),你会看到5GB首先是[Int64]
  • 除了 int 强制转换之外,脚本还有几个其他问题。请同时查看我和其他人的答案。
【解决方案2】:

当您重命名项目时,您添加了一个不允许在文件名中使用的斜杠。如果您尝试创建另一个目录,请澄清。此外,我假设该目录中有多个文件,这需要循环,因为 Get-ChildItem 可能会导致多个对象。让我知道这是否可以为您解决问题。

编辑:修正了指出的错字。

$Path="C:\tmp\NPI_Archive"
$File = Get-ChildItem $Path
$FileSizeLimit = 5kb
foreach($f in $File){
    If ($f.Length -gt $FileSizeLimit)
    {
        Rename-Item -path $f.FullName -NewName "$($f.BaseName)-NPI_Import.csv”
    } 
} 

【讨论】:

  • 您的重命名项将不起作用,因为 "$($file)" 扩展为仅是没有实际路径的文件名。上面的代码适用于这个修改后的行。重命名-项目-路径 $File.FullName -NewName "$($file.BaseName)-NPI_Import.csv"
  • 您没有在循环中使用 $F。将此 foreach($F in $File){ 更改为 foreach($file in $File){
  • 抱歉,在循环和重命名中,所有 $file 实际上都需要为 $F。您实际上也不需要文件路径部分周围的“$()”,但它可以工作。 (啊哈敏德打败了我)。
  • 哇,我不知道我是怎么忽略了这一点。再次感谢你们俩。我已应用更改。
【解决方案3】:

根据您的问题/脚本的措辞,我假设 NPI_Archive 是一个文件夹,在这种情况下,您的检查是针对该文件夹的。

$File = $Path -As [System.IO.FileInfo]
If ($File.Length -gt $FileSizeLimit)

将导致它检查“C:\tmp\NPI_Archive”的大小,这没什么,所以它不会触发你的 if 语句。

您的 Rename-Item 也有一些错误,具体取决于路径语句中的文件夹或文件,修复方式不同。

Rename-Item -path $File.FullName -NewName "$($file.BaseName)-NPI_Import.csv”

如果它是一个实际文件,将修复它,如果你修改它以循环浏览文件夹中的所有文件,它也是你想要使用的行。

编辑 -

您可能有 3 个问题,因为 Jesse 对 Int 的看法也是正确的。

【讨论】:

    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2015-11-26
    • 1970-01-01
    相关资源
    最近更新 更多