for循环中的变量参数根据powershell命令而变化

时间:2013-09-16 16:28:27

标签: powershell foreach

我试图使用powershell在文件夹中的给定类型的所有文件上运行程序。

我首先做了一个测试,看看我是否可以遍历文件夹中的所有文件类型,然后写下来:

$files = ls *.inp
foreach ($file in $files) {echo $file.basename}

输出:

myfile1.inp
myfile2.inp
myfile3.inp

到目前为止,这么好。现在,当我将下一位置于for循环中时,它不起作用:

$files = ls *.inp
foreach ($file in $files) {myProgram arg1=$file.basename}

请注意,myProgram的路径已经是我的路径变量的一部分,所以我不必写myProgram.exe的完整路径,我可以写myProgram。此外,arg1 =我想要处理的文件。

我想看看发生了什么,所以我在循环中回应了上面的命令:

foreach ($file in $files) {echo myProgram arg1=$file.basename}

...输出:

myProgram arg1=myfile.inp.basename

因此,出于某种原因,basename方法在第二种情况下没有按照我的意愿行事。

我将脚本更改为以下内容,效果很好:

foreach ($file in $files) {echo myProgram arg1=$file}

我的问题是,为什么$ file.basename在两个场景中输出不同的东西?如果我只想在第二种情况下使用基本名称,我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:1)

powershell解析器在此上下文中看到$file(一个tring参数)作为完整表达式。因此它执行$file然后将“.basename”附加到其中。要告诉它将整个字符串作为单个表达式执行,您需要将其包装在$()

foreach ($file in $files) {myProgram arg1=$($file.basename)}