【问题标题】:check multiple NAS directories for folder PowerShell检查文件夹 PowerShell 的多个 NAS 目录
【发布时间】:2013-08-26 23:55:44
【问题描述】:

我有一个 NAS 文件夹列表,我必须定期查询这些文件夹是否存在。每个查询都是唯一的,但可能位于 40 多个目录中的任何一个目录下。目录是固定的,我只寻找真或空(对所有目录)响应。我需要有一个用户输入框和一个输出到 txt 文件或带有经过验证的 UNC 路径的弹出对话框。 PowerShell 具有有用的 Test-Path、Read-Host 和 Get-Content 功能,我认为我会使用这些功能,但对其他想法持开放态度。这是我的初步想法,任何帮助将不胜感激。

我的变量

    $Folderquery = Read-Host 'Enter remote folder name'
    $potentialpaths = Get-Content \\nas\listofpaths.txt

我的命令在我存储单个变量 $Folderquery 并针对每个可能的 UNC 路径运行时有效

    Test-Path \\NAS1\Folder1\$Folderquery

我认为我需要在 listofpaths.txt 文件中包含所有可能的 UNC 测试路径,因为每个 NAS 都有数百个主文件夹,我只想在其中的一小部分内进行扫描。

    Foreach ($potentialpaths in (Get-Content \\NAS\listofpaths.txt))
    {
    If (-not (Test-Path $Folderquery)) {
    Write-Output "The Folder $Folderquery does not exist"
    }
    else {
    Write-Output "The Folder $Folderquery has been found on $listofpaths
    }

那么,我该如何把它们放在一起呢?

修改后的代码:

$Folderquery = Read-Host 'Enter remote folder name'
$i = 0
foreach ($potentialpath in (Get-Content \\NAS\listofpaths.txt))
{
  If (Test-Path "$potentialpath\$Folderquery") 
  {
    $i++
  }
}
If ($i -eq 1)
{
  Write-Output "The Folder $Folderquery exists on $potentialpath\$Folderquery" | Out-File "\\NAS\pathlogfile.log" -Encoding ASCII -Append
} 
Elseif ($i -eq 0)
{
  Write-Output "The Folder $Folderquery does not exist" | Out-File "\\NAS\pathlogfile.log" -Encoding ASCII -Append
}    

我应该在哪里休息?如何对这些语句进行分组以使其有效?

【问题讨论】:

  • { Else } If ($i -eq 1) { Write-Output "文件夹 $Folderquery 存在于 $potentialpath\$Folderquery" | Out-File "\\NAS\pathlogfile.log" -Encoding ASCII -Append }

标签: powershell scripting


【解决方案1】:

看起来你已经非常接近你的答案了,这就是你要找的吗?

$Folderquery = Read-Host 'Enter remote folder name'
$i = 0

Foreach ($potentialpath in (Get-Content \\NAS\listofpaths.txt))
{
  If (Test-Path "$potentialpath\$Folderquery") 
  {
    $i++
  }
}

If ($i -eq 0)
{
  Write-Output "The Folder $Folderquery does not exist" | Out-File "C:\logfile.log" -Encoding ASCII -Append
}

【讨论】:

  • 我试过你的脚本,但我得到一个 MissingEndCurlyBrace c:\testpath.ps1:10 char:2 看看那个语法,我想我需要指定一个日志或模式输出?此外,如果文件在任何位置都不存在,我试图只接收一个不存在的文件,并有一个弹出输入框ala VBS 用户输入框。所以,我想我需要比现在更多的东西。
  • 修复了缺少的括号并添加了日志输出。
  • 效果很好,只是我可能把水弄混了。该脚本仅在潜在路径上没有文件夹时才会回复,这就是我认为我所说的......在之前的回复中。如果文件存在,我试图完成的是一个肯定的响应,如果它在任何路径上都不存在,则一个否定的响应。我需要的输出是:“$Folderquery 文件夹不存在”和“$potentialpath 上存在 $Folderquery 文件夹”对不起,我在回复中没有看到森林。
  • 知道了,如果有更优雅的方法可以让我知道。将在上面发布代码
  • 好吧,开个玩笑……这将告诉我该文件夹确实存在。但是,它并没有告诉我正确的路径。它默认为路径列表中的最后一个文件夹
【解决方案2】:

我认为问题在于您正在循环之外打印文件夹存在消息,此时 $potentialpaths (名称应该是单数而不是复数)具有在循环的最后一次迭代中给出的值.从 if(Test-Path) 块内部打印该消息并根据更大的上下文中断/返回/退出,并且假设存在 $Folderquery 的零个或一个实例,或者至少您只对第一个感兴趣一。

【讨论】:

  • 我已经在上面发布了修改后的代码,但由于我的理解有限,我不确定在哪里放置中断以便它正确递归或完全运行。
  • 计数匹配的策略似乎工作量太大。您可以在找到第一个匹配项后立即停止。这将是一个紧跟在 $i++ 语句之后的 break 语句。
  • 现在阅读休息时间。看起来有不同的......我刚刚在 i++ (第 8 行)之后的行上插入了“Break”,这似乎有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多