【问题标题】:PowerShell - ForEach Output to Variables for use with MySQLPowerShell - ForEach 输出到变量以用于 MySQL
【发布时间】:2017-02-02 19:38:31
【问题描述】:

可能是一个愚蠢的问题,但要么我的谷歌搜索能力大幅下降 - 要么似乎没有其他人在问/回答这种事情。

让我们从我的最终目标开始,这样我们就可以看到我是如何做到这一点的:我想运行一个脚本来自动检查文件夹大小的路径。我希望它以 GB 为单位返回文件夹大小。然后,我想将文件夹大小导入到我为报告目的而设置的 MySQL 数据库中。

令人惊讶的是(并且有些不足为奇),昨天刚刚获得文件夹大小是一个相当大的痛苦。经历了互联网/等其他人的一系列不同尝试/功能。

所以,这就是我的结局:

$dirlist = import-csv C:\Users\Public\Folders.csv
foreach ($path in $dirlist)
{
    $name = $path.name
    echo $path >> C:\Users\Public\sizes.txt
    $totalsize = (Get-ChildItem $name -recurse -force | measure-object -property length -sum)
    "{0:N2}" -f($totalsize.sum / 1GB) >> C:\Users\Public\sizes.txt
}

我想这很好。它给了我一个所有尺寸的列表,在他们自己的行上。我只需要为每个尺寸分配它自己的变量。所以,我假设 - 像一个白痴一样 - 我可以使用“var”列在 Folders.csv 文件中预先分配变量。

所以,我做到了。

然后我修改了脚本,如下:

$dirlist = import-csv C:\Users\Public\Folders.csv
function Get-FolderSize
{
    $name = $path.name
    $var = $path.var
    $totalsize = (Get-ChildItem $name -recurse -force | measure-object -property length -sum)
    "{0:N2}" -f($totalsize.sum / 1GB) -outvariable $var
}
foreach ($path in $dirlist)
{
    Get-FolderSize
}

但这会产生以下错误:

At line:12 char:39
+     "{0:N2}" -f($totalsize.sum / 1GB) -outvariable $var
+                                       ~~~~~~~~~~~~
Unexpected token '-outvariable' in expression or statement.
At line:12 char:52
+     "{0:N2}" -f($totalsize.sum / 1GB) -outvariable $var
+                                                    ~~~~
Unexpected token '$var' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

供参考,Folders.csv 基本上就是这样的:

"name","var"
"\\Server\D$\Folder","Folder1"
"\\Server2\G$\Folder","Folder2"

tl;dr // 多个文件路径的 CSV -> 以 GB 为单位获取大小 -> 将每个大小存储在指定变量中

【问题讨论】:

    标签: powershell variables foreach output


    【解决方案1】:

    你可以像这样将循环对象传递给参数:

    $dirlist = import-csv "C:\Users\Public\Folders.csv"
    
    function Get-FolderSize($objectVar)
    {
        $name = $objectVar.name
        $totalsize = (Get-ChildItem $name -recurse -force | measure-object -property length -sum)
        $objectVar.var="{0:N2}" -f ($totalsize.sum / 1GB)
    }
    
    foreach ($path in $dirlist)
    {
        Get-FolderSize $path
    }
    
    $dirlist
    

    【讨论】:

    • 啊,好的 - 这样将输出 $dirlist,但变量名称更改为大小值。哪个,我假设我可以只为 ID 添加一列,然后它只是另一个“foreach”命令将其移至 MySQL? $dirlist | foreach { query = "UPDATE servers SET Size = '$($_.var)' WHERE ID = '$($_.id)'" Execute-MySQLNonQuery $conn $query
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2022-10-26
    • 2020-04-27
    相关资源
    最近更新 更多