检查路径是PowerShell中的文件夹还是文件

时间:2016-10-03 06:11:05

标签: 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}
    }
}

下一节可以清理子文件夹和文件夹。

有什么建议吗?

4 个答案:

答案 0 :(得分:4)

我找到了解决此问题的方法:使用namespace Identity.Areas.Birthdays.Controllers { public class EmailController : ApplicationBaseController { private EmployeeInfoEntities db = new EmployeeInfoEntities(); public ActionResult SendEmail(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } EmployeeInfo employeeInfo = db.EmployeeInfoes.Find(id); if (employeeInfo == null) { return HttpNotFound(); } return View(employeeInfo); } [HttpPost] public ActionResult SendEmail(string receiver, string subject, string message, string from) { try { if (ModelState.IsValid) { var senderEmail = new MailAddress("test@gmail.com"); var receiverEmail = new MailAddress(receiver, "Receiver"); var password = "*********"; var sub = subject; var body = "<font color='red'>" + "<font size='20px'>" + message + "<br />" + "<br />" + "<font color='blue'>" + from + "</font>" + "</font>" + "</font>"; var smtp = new SmtpClient { Host = "smtp.gmail.com", Port = 587, EnableSsl = true, DeliveryMethod = SmtpDeliveryMethod.Network, UseDefaultCredentials = false, Credentials = new NetworkCredential(senderEmail.Address, password) }; using (var mess = new MailMessage(senderEmail, receiverEmail) { Subject = subject, Body = body }) { mess.IsBodyHtml = true; smtp.Send(mess); ViewBag.Message = "Message Has Been Sent!"; } return View(); } } catch (Exception) { ViewBag.Error = "An Error Has Occurred!"; } return View(); } } } cmdlet和参数Test-Path等于-FileType来检查它是否是文件,或使用Leaf来检查它是否是文件。是一个文件夹:

Container

Demo

我最初找到了解决方法here。官方参考是here

答案 1 :(得分:3)

我认为你的$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}
        }
  }

答案 2 :(得分:0)

请考虑以下代码:

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

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

$Files | ForEach {
    $_.FullName
}

第一个foreach是用于循环的PowerShell语言命令,第二个ForEach是ForEach-Object cmdlet的别名,这是完全不同的。

ForEach-Object中,$_指向循环中的当前对象,从$Files集合传入,但在第一个foreach中,$_具有没意思。

在foreach循环中使用循环变量$file

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

答案 3 :(得分:0)

我们可以使用 get-item 命令并提供路径。然后您可以检查 PSIsContainer (boolean) 属性,该属性将确定提供的路径是针对文件夹还是文件。例如

$target = get-item "C:\somefolder" # or "C:\somefolder\somefile.txt"
if($target.PSIsContainer) {
# it's a folder
}
else { #its a file }

希望这对未来的访问者有所帮助。