创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}