2016-10-03 101 views
1

我試圖編寫一個powershell腳本,它通過文件夾或文件路徑的值列表,然後刪除文件,然後刪除空文件夾。Powershell檢查路徑是文件夾還是文件

我至今腳本:

[xml]$XmlDocument = Get-Content -Path h:\List_Files.resp.xml 
$Files = XmlDocument.OUTPUT.databrowse_BrowseResponse.browseResult.dataResultSet.Path 

現在我想測試每一行的變量,看它是否是一個文件,先將它刪除,然後再通過和刪除子文件夾和文件夾。這只是一個乾淨的過程。

我不能完全得到這下有點工作,但我想,我需要這樣的東西:

foreach ($file in $Files) 
    { 
    if (! $_.PSIsContainer) 
    { 
    Remove-Item $_.FullName} 
    } 
    } 

下一節可以清理子文件夾和文件夾。

有什麼建議嗎?

+2

使用$文件,而不是$ _在循環。 –

回答

0

考慮下面的代碼:

$Files = Get-ChildItem -Path $env:Temp 

foreach ($file in $Files) 
{ 
    $_.FullName 
} 

$Files | ForEach { 
    $_.FullName 
} 

第一的foreach是用於循環一個PowerShell語言命令,第二的ForEach是用於ForEach-Object小命令是完全不同的東西的別名。

ForEach-Object$_點在環路當前對象,如從$Files收集管道中,但在第一的foreach $_沒有意義。

在foreach循環使用循環變量$file

foreach ($file in $Files) 
{ 
    $file.FullName 
} 
2

我認爲你$Files對象是一個字符串數組:

PS D:\PShell> $Files | ForEach-Object {"{0} {1}" -f $_.Gettype(), $_} 
System.String D:\PShell\SO 
System.String D:\PShell\SU 
System.String D:\PShell\test with spaces 
System.String D:\PShell\tests 
System.String D:\PShell\addF7.ps1 
System.String D:\PShell\cliparser.ps1 

不幸的是,PSIsContainer屬性不能在發現字符串對象但在文件系統對象,例如

PS D:\PShell> Get-ChildItem | ForEach-Object {"{0} {1}" -f $_.Gettype(), $_} 
System.IO.DirectoryInfo SO 
System.IO.DirectoryInfo SU 
System.IO.DirectoryInfo test with spaces 
System.IO.DirectoryInfo tests 
System.IO.FileInfo addF7.ps1 
System.IO.FileInfo cliparser.ps1 

從字符串獲取文件系統對象:

PS D:\PShell> $Files | ForEach-Object {"{0} {1}" -f (Get-Item $_).Gettype(), $_} 
System.IO.DirectoryInfo D:\PShell\SO 
System.IO.DirectoryInfo D:\PShell\SU 
System.IO.DirectoryInfo D:\PShell\test with spaces 
System.IO.DirectoryInfo D:\PShell\tests 
System.IO.FileInfo D:\PShell\addF7.ps1 
System.IO.FileInfo D:\PShell\cliparser.ps1 

試試下面的代碼片段:

$Files | ForEach-Object 
    { 
    $file = Get-Item $_    ### string to a filesystem object 
    if (-not $file.PSIsContainer) 
     { 
      Remove-Item $file} 
     } 
    } 
相關問題