【问题标题】:Trouble linking commands together无法将命令链接在一起
【发布时间】:2022-10-17 05:19:22
【问题描述】:

所以我对powershell很陌生,我试图列出一个目录(在我的vm上)的所有内容,同时说明每个目录是否是一个reg文件或目录以及它的路径/大小。 我的代码是:

#!/bin/bash
cd c:\
foreach ($item in get-childitem -Path c:\) {
    Write-Host $item
}
########
if(Test-Path $item){
    Write-Host "Regular File" $item
}
else {
    Write-Host "Directory" $item
}

我可以打印所有内容,但是当我尝试说明是否是文件/目录时,只有一个.txt 文件旁边显示“常规文件”。我已经连续几个小时搞定了。另外,我的输出没有在目录旁边声明“目录”......

【问题讨论】:

  • 为什么要为 PowerShell 脚本添加 bash shebang?
  • 您的 if () {...} else {...} 代码需要移动到 foreach 块 { ... 大括号之间 ... } 和 Test-Path 对于常规文件和目录都将成功,因此它将总是说“常规文件”。请阅读关于页面,如果您仍有问题,请稍后再回来。 foreachGet-ChildItem
  • 在学习时使用Get-MemberGet-Help。很少使用Write-Host,除非你绝对需要在屏幕上写一些文字,然后再三思。阅读about_Scripts 以及“另请参阅”部分下的所有链接页面

标签: powershell file filesystems


【解决方案1】:

这是一个示例,说明如何枚举C 驱动器上的文件和文件夹的当前大小(如果是文件夹,则查找其中的文件并获得其长度的总和)。关于试图“状态是否是文件/目录”,您不需要对其应用任何逻辑,FileInfoDirectoryInfo 有一个 Attributes 属性,它已经为您提供了此信息。

Get-ChildItem -Path C: | & {
    process {
        $object = [ordered]@{
            Attributes = $_.Attributes
            Path       = $_.Name # change to $_.FullName for the Path
            Length     = $_.Length / 1mb
        }

        if($_ -is [IO.DirectoryInfo]) {
            foreach($file in $_.EnumerateFiles()) {
                $object['Length'] += $file.Length / 1mb
            }
        }
        $object['Length'] = [math]::Round($object['Length'], 2).ToString() + ' Mb'
        [pscustomobject] $object
    }
}

如果您想要更复杂的东西,即查看目录的层次结构,如 tree 所做的那样,具有相应的大小,您可以查看 this module

【讨论】:

    猜你喜欢
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多