我有数百个文件夹代表我的所有子网。
例如,文件夹名称
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
答案 0 :(得分:2)
Get-ChildItem
返回一个System.IO.DirectoryInfo
或System.IO.FileInfo
对象,而不是字符串。由于您指定了-Directory
,因此首先需要将DirectoryInfo
对象转换为字符串
一种简单的方法是更改代码的第一行:
$NmapFolder = @( ( Get-ChildItem -Path "U:\nmap reports\Nmap Subnet Scans\August2019" -Recurse -Directory -Force -ErrorAction SilentlyContinue ).Name )
这会将每个返回的DirectoryInfo
对象的Name属性汇总到字符串数组中,然后可以对其进行迭代。但是,如果您要遍历更深的目录结构(我想您可能正在使用-Recurse
,那么您可能要考虑利用将Get-ChildItem
命令管道传输到Resolve-Path -Relative
中,并从该字符串数组中解析您的子网文件夹名称,因为看起来最终您可能会尝试通过此脚本将某些内容写回到该文件夹中。