sách gpt4 ai đã đi

PowerShell ForEach $file in $Files 中的每个 $file

In lại 作者:行者123 更新时间:2023-12-02 22:34:45 44 4
mua khóa gpt4 Nike

我有一个 PowerShell 脚本,它获取文件列表并移动满足特定条件的文件。为什么即使对象为空,foreach 循环也会运行?

我假设如果 $i 不存在,它就不会运行。但是如果 $filePath 中没有结果,为什么 forEach 循环会运行一次?我已经解决了我的问题,但我很好奇,我尝试搜索,但找不到答案。

为了使其正常工作,我只需检查以确保 $filePath 在 forEach 循环之前存在。

例如,if ($filePath){...

 $filePath = Get-ChildItem -Path $sourceDir | Where-Object {! $_.PSIsContainer -AND ($_.Name -Match "^XXX_XXX*" -OR $_.Name -Match "^YYY_XX*")}

ForEach($i in $filePath){
$sfName = $i.Name
$sfDir = $i.Directory
$tFileName = testFile $destDir $sfName
$sFile = $sourceDir + $sfName
$tFile = $destDir + $tFileName

moveFile $sFile $tFile

1 Câu trả lời

这是一个经典问题,已在 PowerShell V3 IIRC 中修复。 PowerShell 的 foreach 循环将允许您迭代标量值,例如:

foreach ($i in 1) {$i}

这很方便,因为很多时候您迭代的集合可以包含 0、1 或 N 个项目,例如:

$files = Get-ChildItem c:\temp\*.txt
foreach ($file in $files) {$file}

在这种情况下,Get-ChildItem 可能返回 0、1 或 N 个文件。 N 个文件很棒,我们可以对其进行迭代。但是,如果它返回 1 个文件,然后您必须将该一个文件粘贴到一个数组中,以便您可以使用 foreach - 好吧,这有点糟糕。因此,foreach 允许您迭代标量对象。当 Get-ChildItem 返回 0 个对象时会出现此问题。在这种情况下,空数组不会分配给 $files。相反,$null 被分配。 PowerShell 将 $null 视为标量,因此 foreach 循环将在迭代值为 $null 时执行一次。那种很糟糕。我和许多其他人很早就告诉团队这一点,因此在 V3 中,他们更改了 foreach,以便在值为 $null 时不迭代标量。

在 V1/V2 中解决此问题的另一种方法是确保空情况生成空数组而不是 $null。您可以使用 @() 数组表达式来做到这一点,例如

$files = @(Get-ChildItem c:\temp\*.txt)
foreach ($file in $files) {$file}

这适用于 0、1 和 N 个文件。它适用于 0 个文件,因为 @() 将导致将空数组分配给 $files。 foreach 在循环空数组时不会执行其主体。

关于PowerShell ForEach $file in $Files 中的每个 $file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29440314/

44 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com