如何将txt文件中的PowerShell命令导入ps1脚本并执行得到计算结果?
解决PowerShell脚本读取配置文件后无法执行命令的问题
问题描述
当前scr3.ps1读取var1.txt中的配置项时,仅将time、extn等字段的值作为字符串存储,没有执行其中的PowerShell表达式,导致输出的是表达式字面量而非执行结果,后续文件筛选逻辑也无法正常工作。
现有文件内容
- var1.txt:
time=(Get-Date).AddYears(-1) extn=@("*.mp3", "*.jpg") path=E:\marathi\Lavani
- 原scr3.ps1:
$ConfigFile = "E:\marathi\Lavani\var1.txt" #Creating an empty hash table $ConfigKeys = @{} #Pulling, separating, and storing the values in $ConfigKey Get-Content $ConfigFile | ForEach-Object { $Keys = $_ -split "=" $ConfigKey += @{$Keys[0]=$Keys[1]} } $extn2 = $ConfigKey.extn $path2 = $ConfigKey.path $time2 = $ConfigKey.time $time2 $extn2 $path2 Get-ChildItem -Include $extn2 -Path $path2 -Recurse | Where-Object {($_.LastWriteTime -lt $time2)}
当前问题
脚本运行后仅输出表达式字符串:
(Get-Date).AddYears(-1) @("*.mp3", "*.jpg") E:\marathi\Lavani
无法得到预期的执行结果和文件筛选功能。
解决方案
需要修正两个核心问题:哈希表变量名拼写错误,以及执行配置项中的PowerShell表达式。
修改后的scr3.ps1代码
$ConfigFile = "E:\marathi\Lavani\var1.txt" # 创建空哈希表 $ConfigKeys = @{} # 读取配置并执行表达式后存储 Get-Content $ConfigFile | ForEach-Object { # 仅拆分第一个=号,避免值中包含=的情况 $Keys = $_ -split "=", 2 if ($Keys.Count -eq 2) { $keyName = $Keys[0].Trim() $valueExpression = $Keys[1].Trim() # 执行表达式并获取实际结果 $value = Invoke-Expression $valueExpression $ConfigKeys[$keyName] = $value } } $extn2 = $ConfigKeys.extn $path2 = $ConfigKeys.path $time2 = $ConfigKeys.time $time2 $extn2 $path2 Get-ChildItem -Include $extn2 -Path $path2 -Recurse | Where-Object { $_.LastWriteTime -lt $time2 }
关键修改说明
- 修正哈希表变量名:原脚本中定义的哈希表是
$ConfigKeys,但后续赋值和读取时误用了$ConfigKey,导致哈希表未正确填充,现已统一为$ConfigKeys。 - 执行表达式:使用
Invoke-Expression执行配置值中的PowerShell代码,将计算后的结果(如日期对象、数组)存入哈希表,而非存储字符串字面量。 - 安全拆分配置项:使用
-split "=", 2确保只拆分第一个=号,避免配置值中包含=时出现错误拆分。
执行效果
运行修改后的脚本,将输出预期结果:
26 May 2022 11:32:46 AM *.mp3 *.jpg E:\marathi\Lavani
同时Get-ChildItem会正确筛选出指定路径下、扩展名匹配且最后写入时间早于计算日期的文件。
内容的提问来源于stack exchange,提问作者Shreya Patil
相关产品推荐
相关产品推荐

