【问题标题】:Need to make a powershell script to run test-path for every line in a file, how?需要制作一个powershell脚本来为文件中的每一行运行测试路径,如何?
【发布时间】:2019-05-03 09:16:15
【问题描述】:

我想做一个脚本。它将从记录路径的文件中读取内容。并为文件中的路径运行 test-path 以验证这些文件/路径是否存在于本地机器上。

这是我当前的 powershell 代码:

Foreach ($path in (get-content C:\temp\pathlist.txt)){
    [PSCustomObject]@{
        path = $path
        Exists = test-path $path
    }
}

但是,即使路径存在且 txt 中只有一行,它也会始终返回 'False'。 我还尝试了 -TotalCount 来限制它读取的行。但是又失败了。

此外,实际上我想对 txt 进行一些字符串处理。上面代码中的 txt 只包含正常路径。但是我会得到的实际 txt 格式为: "C:\Windows\","1" 我曾经使用 $path= $path.split(",")[0] 来获取“C:\windows”。但是为了解决总是“错误”的问题,我改用了一个简单的 txt 并在我的代码中删除了这部分。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您的代码似乎运行良好。我想这一定与您的文本格式有关? 您能否也分享您用于测试的文本文件?

    我的文本文件:

    C:\Temp
    C:\Windows
    C:\NoExist
    C:\Program Files
    

    代码:

    Foreach ($path in Get-Content .\test.txt) {
       [PSCustomObject]@{
            path   = $path
            Exists = Test-Path $path
       }
    }
    

    我的输出:

    path             Exists
    ----             ------
    C:\Temp            True
    C:\Windows         True
    C:\NoExist        False
    C:\Program Files   True
    

    评论后编辑:

    您可以使用 .split() 在 " 上拆分路径,示例如下。

    新建文本文件:

    "C:\temp\","1"
    "C:\Windows\","3"
    "C:\NoExist\","1"
    "C:\Program Files\","2"
    

    新代码:

    Foreach ($path in Get-Content .\test.txt) {
        $path = $path.Split('"')
        [PSCustomObject]@{
            path   = $path[1]
            Exists = Test-Path $path[1]
        }
    }
    

    输出:

    path              Exists
    ----              ------
    C:\temp\           False
    C:\Windows\         True
    C:\NoExist\        False
    C:\Program Files\   True
    

    【讨论】:

    • 谢谢。我试过你的文本文件,这对我的脚本也很好。但实际上我文本中的路径有双引号“”作为“C:\temp”。我发现 test-path "C:\temp" 返回 true,但是当我使用此代码时它返回 false。而且我不知道如何用 "... 分割这个字符串并且我的原始文本就像 "C:\temp\","1" ,它是进程监视器的输出,“1”表示它出现一次,我只需要此字符串中的路径..你能帮我吗?谢谢!
    • 所以我使用 path = $path.split("""")[1] 或 path = $path.split("""")[-4] 作为我的文本(例如, "c:\TEMP","1")。输出中的路径看起来正确,但它返回 false..
    • 对我的帖子进行了编辑,展示了如何处理拆分。
    • 谢谢。感谢您在这个问题上所做的努力......我不知道为什么,但似乎在睡觉后我的脚本可以在我的机器上运行......现在我还有其他一些问题,但我会分开这个问题。很高兴在这里获得您的帮助。
    【解决方案2】:

    您的代码对我来说运行良好 - 我看到的唯一内容是您在 foreach 之间有一个空格,但这可能只是一个错字

    我使用了一个包含现有目录和不存在目录的文件来测试您的代码,它运行良好:

    $tested_paths = foreach ($path in (Get-Content ".\paths.txt")) {
        [PSCustomObject]@{
            path_name   = $path
            path_exists = Test-Path $path
        }
    }
    
    $tested_paths | Format-Table
    

    【讨论】:

    • 谢谢!是的,这是错字。这是我在stackoverflow中的第一个问题,我尝试粘贴我的代码但失败了,所以我手动输入了它们。您可以看到我对 Michael B 的评论,我发现当格式中文本中的路径包含双引号“C:\temp”时它会失败
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2022-01-23
    • 2023-03-03
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多