首页 > 解决方案 > 方法调用失败,因为 [System.IO.DirectoryInfo] 不包含名为“replace”的方法

问题描述

我有几百个文件夹来代表我所有的子网。

例如,对于文件夹名称

172.31.3.250_29

表示子网

172.31.3.250/29

因为 Windows 文件夹名称中不能有“/”。

我有大约 250 个这样的文件夹。

我正在编写一个powershell脚本,它将获取每个文件夹名称并针对该文件夹所代表的“子网”运行一个脚本,并将日志转储到该文件夹​​中。

但是,我被困在一个简单的问题上。

我已成功提取文件夹中所有子文件夹的名称

我需要用“/”替换“_”来表示我的脚本的正确子网格式。

$NmapFolder = Get-ChildItem -Path "U:\nmap reports\Nmap Subnet Scans\August2019" -Recurse -Directory -Force -ErrorAction SilentlyContinue

$data = ForEach ($items in $NmapFolder){
    $items = $items.replace('_','/')
    #eventually will have nmap script logic
    #eventually will have "wait for nmap done" check before proceeding with next folder/subnet
    write-host $items
}

这会产生错误...

Method invocation failed because [System.IO.DirectoryInfo] does not contain a method named 'replace'.
At line:6 char:1
+ $items = $items.replace('_','/')
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

标签: powershell

解决方案


Get-ChildItem返回一个System.IO.DirectoryInfoSystem.IO.FileInfo对象,而不是字符串。由于您已指定-Directory,您首先需要将DirectoryInfo对象转换为字符串。

一种简单的方法是更改​​代码的第一行:

$NmapFolder = @( ( Get-ChildItem -Path "U:\nmap reports\Nmap Subnet Scans\August2019" -Recurse -Directory -Force -ErrorAction SilentlyContinue ).Name )

这会将每个返回对象的 Name 属性汇总DirectoryInfo到一个字符串数组中,然后您可以对其进行迭代。但是,如果您要遍历更深的目录结构(我假设您可能会因为您正在使用-Recurse),您可能需要考虑使用管道将您的Get-ChildItem命令输入Resolve-Path -Relative,并从该字符串数组中解析您的子网文件夹名称,因为它看起来就像最终你可以尝试从这个脚本写回那个文件夹。


推荐阅读