对Powershell来说很陌生,希望有人能指出我正确的方向。我想弄清楚是否有更清洁的方法来完成我在下面的工作?有没有办法刷新Get-ChildItem的内容一旦我对第一个Get-ChildItem调用期间返回的文件(存储在$ items变量中)做了一些更改?
在第一个foreach语句中,我正在为返回的所有文件创建日志签名。一旦完成,我需要做的是;再次获取列表(因为路径中的项已更改),第二个Get-ChildItem将包括在第一个Get-ChildItem调用期间找到的文件以及第一个foreach语句调用时生成的所有logFiles generate-LogFile函数。所以我的问题是,有没有办法更新列表而不必调用get-chilItem两次,以及使用两个foreach语句?
感谢您的帮助!
--------------这就是我根据推荐--------------
更改了代码$dataStorePath = "C:\Process"
function print-All($file)
{
Write-Host "PrintALL filename:" $file.FullName #Only prints when print-All($item) is called
}
function generate-LogFile($file)
{
$logName = $file.FullName + ".log"
$logFilehandle = New-Object System.IO.StreamWriter $logName
$logFilehandle.Writeline($logName)
$logFilehandle.Close()
return $logName
}
$items = Get-ChildItem -Path $dataStorePath
foreach ($item in $items)
{
$log = generate-LogFile($item) #Contains full path C:\Process\$fileName.log
print-All($item)
print-All($log) #When this goes to the function, nothing prints when using $file.FullName in the print-All function
}
---------输出--------------
为了测试我在C:\ Process中有两个文件: fileA.txt& fileB.txt
我将创建另外两个文件 fileA.txt.log& fileB.txt.log
最终我需要对所有四个文件做一些事情。我创建了一个print-All Function,我将处理所有四个文件。以下是当前的输出。可以看出,我只获得了找到的两个原始文件的输出,而不是另外创建的两个(在调用print-All($ log)时获取空行)。我需要能够使用Get-ChildItem提供的fullpath属性,因此使用FullName
PrintALL filename: fileA.txt
PrintALL filename:
PrintALL filename: fileB.txt
PrintALL filename:
答案 0 :(得分:1)
我不清楚你在问什么,可以generate-LogFile
返回创建的日志文件,然后只在你的文件和日志文件上调用generateRequestData
?像这样:
$items = Get-ChildItem -Path $dataStorePath
foreach ($file in $items)
{
$logFile = generate-LogFile $file
generateRequestData $file
generateRequestData $logFile
}
修改强>
在您添加的示例中,您将从generate-LogFile
返回一个字符串。 .NET字符串没有FullName
属性,因此print-All
中不会打印任何内容。要获取所需的FileInfo
对象,请使用get-item
命令行开关:
return Get-Item $logName
此外,在此示例中,您不需要使用StreamWriter
来写入文件,您可以使用本机powershell Out-File
命令行开关:
function generate-LogFile($file)
{
$logName = $file.FullName + ".log"
$logName | Out-File $logName
return Get-Item $logName
}