2013-09-16 26 views
1

我正在嘗試使用powershell在文件夾內給定類型的所有文件上運行程序。for循環中的變量參數根據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 

所以,出於某種原因,基名方法沒有按照我想要的方式在第二種情況下進行。

我改變了我的腳本如下,工作正常:

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

我的問題是,爲什麼在兩種情況下確實$ file.basename輸出不同的東西?如果我只想在第二種情況下使用基本名稱,我該怎麼做?

謝謝!

回答

1

powershell解析器在此上下文(一個tring參數)中將$file看作完整表達式。所以它執行$file,然後附加「.basename」。要告訴它將整個字符串作爲單個表達式執行,您需要將其包裝在$()中:

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

已經工作 - 非常感謝! – user110174