我正在研究如何循环遍历一组文件并对这些文件执行一个程序,该程序在扫描hyper-v虚拟硬盘时输出一个日志和tar文件。
我已经发现的是:在一个卷上收集所有VHDX。把它们放到一个变量中
然而,我被困在处理foreach,并有一个灵活的输出的tar文件和日志名称。
的例子:
Get-ChildItem -Path $VDHXPath -Filter $Extension -Recurse -ErrorAction SilentlyContinue -Force | % { $_.FullName }
其中$VHDXPath表示一个可自定义变量,该变量表示驱动程序。这样我得到一个变量填充一个或多个VHDX。
那么我需要对查询/库存的VHDX执行程序。平面单文件/直命令行如下:
win.exe guid -o "tarfile.tar" -l "logfile.log" -p default --history "pathtovhdxfile.vhdx"
所以我已经尝试了许多关于如何执行foreach和调用命令来与VHDX对话的变体。例子:
Foreach ($file in $files){
Start-Process -NoNewWindow -FilePath ".win.exe" -ArgumentList "guid -o tarfile.tar -l logfile.tar -p default --history vhdxfile.vhdx"
}
其中tar文件和日志文件的输出,必须与正在处理的VHDX的名称相匹配。
我也试过:
Foreach ($file in $files){
& ".win.exe" "guid -o tarfile.tar -l logfile.tar -p default --history vhdxfile.vhdx"
}
可惜没有结果。我得到的提示要么是这个程序不是一个有效的powershell命令行,要么是一个可执行的程序。或者程序本身的反应是tarfile, logfile和vhdxfiles无效,因为命令行一次占用所有VHDX'。
目标是获取包含它所处理的每个VHDX的名称的tar和日志文件。
如有任何指导,将不胜感激
编辑:
我要走远一点了:
$VDHXPath = "C:Users%USERNAME%"
$Extension = "*.VHDX"
Foreach ($file in Get-ChildItem -Path $VDHXPath -Filter $Extension -Recurse -ErrorAction SilentlyContinue -Force | % { $_.FullName }) {
& .win.exe guid -o '.$file.name'.tar -l '.$file.name'.log -p default --history $file
}
所以现在程序遍历文件,但我只是在per VHDX日志文件名和tar文件名中挣扎。
使用$file.BaseName
获取不带扩展名的文件名。要在可扩展字符串中展开成员表达式(如$file.FullName
),请使用$()
子表达式操作符:
Foreach ($file in Get-ChildItem -Path $VDHXPath -Filter $Extension -Recurse -ErrorAction SilentlyContinue -Force) {
$basename = $file.BaseName
& .win.exe guid -o ".${basename}.tar" -l ".${basename}.log" -p default --history "$($file.FullName)"
}