创build目录,如果它不存在

我正在编写一个PowerShell脚本来创build几个目录,如果它们不存在。

文件系统看起来与此类似

D:\ D:\TopDirec\SubDirec\Project1\Revision1\Reports\ D:\TopDirec\SubDirec\Project2\Revision1\ D:\TopDirec\SubDirec\Project3\Revision1\ 
  • 每个项目文件夹都有多个修订版本。
  • 每个修订文件夹需要一个Reports文件夹。
  • 一些“修订”文件夹已经包含一个报告文件夹; 但是,大多数不。

我需要编写一个每天运行的脚本来为每个目录创build这些文件夹。

我能写脚本来创build一个文件夹,但创build几个文件夹是有问题的。

你有没有尝试过-Force参数?

 New-Item -ItemType Directory -Force -Path C:\Path\That\May\Or\May\Not\Exist 

您可以使用Test-Path -PathType Container来首先检查。

有关更多详细信息,请参阅New-Item MSDN帮助文章。

 $path = "C:\temp\NewFolder" If(!(test-path $path)) { New-Item -ItemType Directory -Force -Path $path } 

Test-Path检查以查看path是否存在。 当它不,它会创build一个新的目录。

我有同样的问题。 你可以使用这样的东西:

 $local = Get-Location; $final_local = "C:\Processing"; if(!$local.Equals("C:\")) { cd "C:\"; if((Test-Path $final_local) -eq 0) { mkdir $final_local; cd $final_local; liga; } ## If path already exists ## DB Connect elseif ((Test-Path $final_local) -eq 1) { cd $final_local; echo $final_local; liga; (function created by you TODO something) } } 

当你指定-Force标志时,如果文件夹已经存在,PowerShell不会抱怨。

一内胆:

 Get-ChildItem D:\TopDirec\SubDirec\Project* | ` %{ Get-ChildItem $_.FullName -Filter Revision* } | ` %{ New-Item -ItemType Directory -Force -Path (Join-Path $_.FullName "Reports") } 

顺便说一句,安排任务,请检查出这个链接: 调度后台作业 。

我知道有3种使用PowerShell创build目录的方法

 Method 1: PS C:\> New-Item -ItemType Directory -path "c:\livingston" 

在这里输入图像说明

 Method 2: PS C:\> [system.io.directory]::CreateDirectory("c:\livingston") 

在这里输入图像说明

 Method 3: PS C:\> md "c:\livingston" 

在这里输入图像说明

从你的情况是听起来像你需要创build一个“修订#”文件夹一天一次“报告”文件夹在那里。 如果是这样的话,你只需要知道下一个版本号是什么。 编写一个获取下一个版本号Get-NextRevisionNumber的函数。 或者你可以做这样的事情:

 foreach($Project in (Get-ChildItem "D:\TopDirec" -Directory)){ #Select all the Revision folders from the project folder. $Revisions = Get-ChildItem "$($Project.Fullname)\Revision*" -Directory #The next revision number is just going to be one more than the highest number. #You need to cast the string in the first pipeline to an int so Sort-Object works. #If you sort it descending the first number will be the biggest so you select that one. #Once you have the highest revision number you just add one to it. $NextRevision = ($Revisions.Name | Foreach-Object {[int]$_.Replace('Revision','')} | Sort-Object -Descending | Select-Object -First 1)+1 #Now in this we kill 2 birds with one stone. #It will create the "Reports" folder but it also creates "Revision#" folder too. New-Item -Path "$($Project.Fullname)\Revision$NextRevision\Reports" -Type Directory #Move on to the next project folder. #This untested example loop requires PowerShell version 3.0. } 

PowerShell 3.0安装

我希望能够让用户轻松地让用户创build一个PowerShell的默认configuration文件来覆盖一些设置,并结束了以下一行(多个语句是,但可以粘贴到PowerShell中,并立即执行,这是主要目标):

 cls; [string]$filePath = $profile; [string]$fileContents = '<our standard settings>'; if(!(Test-Path $filePath)){md -Force ([System.IO.Path]::GetDirectoryName($filePath)) | Out-Null; $fileContents | sc $filePath; Write-Host 'File created!'; } else { Write-Warning 'File already exists!' }; 

为了便于阅读,下面是我将如何在ps1文件中执行此操作:

 cls; # Clear console to better notice the results [string]$filePath = $profile; # declared as string, to allow the use of texts without plings and still not fail. [string]$fileContents = '<our standard settings>'; # Statements can now be written on individual lines, instead of semicolon separated. if(!(Test-Path $filePath)) { New-Item -Force ([System.IO.Path]::GetDirectoryName($filePath)) | Out-Null; # Ignore output of creating directory $fileContents | Set-Content $filePath; # Creates a new file with the input Write-Host 'File created!'; } else { Write-Warning "File already exists! To remove the file, run the command: Remove-Item $filePath"; }; 
 $path = "C:\temp\" If(!(test-path $path)) {md C:\Temp\} 
  • 第一行创build一个名为$path的variables,并为其分配string值“C:\ temp \”

  • 第二行是一个If语句,它依赖于Test-Path cmdlet来检查variables$path是否不存在。 不存在的是使用! 符号

  • 第三行:如果没有find存储在上面string中的path,大括号之间的代码将被运行

md是输出的简短版本: New-Item -ItemType Directory -Path $path

注意:如果path已经存在,我还没有使用下面的-Force参数进行testing,以查看是否存在不良行为。

New-Item -ItemType Directory -Path $path

以下代码片段可帮助您创build完整path。

  Function GenerateFolder($path){ $global:foldPath=$null foreach($foldername in $path.split("\")){ $global:foldPath+=($foldername+"\") if(!(Test-Path $global:foldPath)){ New-Item -ItemType Directory -Path $global:foldPath # Write-Host "$global:foldPath Folder Created Successfully" } } } 

上面的函数分割你传递给函数的path,并检查每个文件夹是否存在。 如果它不存在,它将创build相应的文件夹,直到创build目标/最终文件夹。

要调用该函数,请使用以下语句:

 GenerateFolder "H:\Desktop\Nithesh\SrcFolder" 

这是一个简单的为我工作。 它检查path是否存在,如果不存在,它将不仅创build根path,而且还创build所有的子目录:

 $rptpath = "C:\temp\reports\exchange" if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}