Создать каталог, если он не существует
Я пишу PowerShell script для создания нескольких каталогов, если они не существуют.
Файловая система похожа на эту
D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
- Каждая папка проекта имеет несколько версий.
- Каждая папка ревизии нуждается в папке "Отчеты".
- Некоторые из папок "ревизий" уже содержат папку "Отчеты"; однако, большинство нет.
Мне нужно написать script, который запускается ежедневно, чтобы создавать эти папки для каждого каталога.
Я могу написать script для создания папки, но создание нескольких папок проблематично.
Ответы
Ответ 1
Попробуйте параметр -Force
:
New-Item -ItemType Directory -Force -Path C:\Path\That\May\Or\May\Not\Exist
Вы можете использовать Test-Path -PathType Container
, чтобы сначала проверить.
Дополнительную информацию смотрите в справочной статье по MSDN New-Item.
Ответ 2
$path = "C:\temp\NewFolder"
If(!(test-path $path))
{
New-Item -ItemType Directory -Force -Path $path
}
Test-Path
проверяет, существует ли путь. Когда этого не произойдет, он создаст новый каталог.
Ответ 3
У меня была такая же проблема. Вы можете использовать что-то вроде этого:
$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)
}
}
Ответ 4
Когда вы указываете флаг -Force
, PowerShell не будет жаловаться, если папка уже существует.
Однострочник:
Get-ChildItem D:\TopDirec\SubDirec\Project* | `
%{ Get-ChildItem $_.FullName -Filter Revision* } | `
%{ New-Item -ItemType Directory -Force -Path (Join-Path $_.FullName "Reports") }
BTW, для планирования задачи, пожалуйста, ознакомьтесь с этой ссылкой: Планирование фоновых заданий.
Ответ 5
Существует три способа создания каталога с помощью PowerShell:
Method 1: PS C:\> New-Item -ItemType Directory -path "C:\livingston"
![Enter image description here]()
Method 2: PS C:\> [system.io.directory]::CreateDirectory("C:\livingston")
![Enter image description here]()
Method 3: PS C:\> md "C:\livingston"
![Enter image description here]()
Ответ 6
Следующий фрагмент кода поможет вам создать полный путь.
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"
}
}
}
Вышеуказанная функция разделяет путь, который вы передали функции, и проверяет каждую папку, существует она или нет. Если он не существует, он будет создавать соответствующую папку до тех пор, пока не будет создана целевая/конечная папка.
Чтобы вызвать функцию, используйте следующую инструкцию:
GenerateFolder "H:\Desktop\Nithesh\SrcFolder"
Ответ 7
Исходя из вашей ситуации, создается впечатление, что вам нужно создавать папку "Revision #" один раз в день с папкой "Отчеты". Если это так, вам просто нужно знать номер следующей ревизии. Напишите функцию, которая получает следующий номер версии, 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 two 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.
Ответ 8
Я хотел, чтобы пользователи могли легко создать профиль по умолчанию для PowerShell, чтобы переопределить некоторые параметры, и в итоге получили следующий однострочный текст (несколько операторов да, но их можно вставить в 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";
};
Ответ 9
Вот простой, который работал на меня. Он проверяет, существует ли путь, а если нет, он создаст не только корневой путь, но и все подкаталоги:
$rptpath = "C:\temp\reports\exchange"
if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}
Ответ 10
Использование:
$path = "C:\temp\"
If (!(test-path $path))
{
md C:\Temp\
}
Первая строка создает переменную с именем $path
и присваивает ей строковое значение "C:\temp \"
Вторая строка - это оператор If
, который использует командлет Test-Path, чтобы проверить, не существует ли переменная $path
. Не существует квалифицируется с использованием символа !
.
Третья строка: если путь, сохраненный в приведенной выше строке, не найден, будет выполнен код между фигурными скобками.
md
- короткая версия ввода: New-Item -ItemType Directory -Path $path
Примечание. Я не проверял использование параметра -Force
из приведенного ниже, чтобы выяснить, есть ли нежелательное поведение, если путь уже существует.
New-Item -ItemType Directory -Path $path