Créer le répertoire s'il n'existe pas
j'écris un script PowerShell pour créer plusieurs répertoires s'ils n'existent pas.
le système de fichiers ressemble à ce
D:
D:TopDirecSubDirecProject1Revision1Reports
D:TopDirecSubDirecProject2Revision1
D:TopDirecSubDirecProject3Revision1
- chaque dossier de projet a plusieurs révisions.
- chaque dossier de révision a besoin d'un dossier de rapports.
- certains dossiers" révisions " contiennent déjà un dossier Rapports, mais la plupart ne le contiennent pas.
j'ai besoin pour écrire un script qui tourne quotidiennement pour créer ces dossiers pour chaque répertoire.
je suis capable d'écrire le script pour créer un dossier, mais créer plusieurs dossiers est problématique.
10 réponses
avez-vous essayé le paramètre -Force
?
New-Item -ItemType Directory -Force -Path C:\Path\That\May\Or\May\Not\Exist
vous pouvez utiliser Test-Path -PathType Container
pour vérifier en premier.
voir le nouvel article article d'aide du MSDN pour plus de détails.
$path = "C:\temp\NewFolder"
If(!(test-path $path))
{
New-Item -ItemType Directory -Force -Path $path
}
Test-Path
vérifie si le chemin existe. Quand il n'est pas, il va créer un nouveau répertoire.
j'ai eu exactement le même problème. Vous pouvez utiliser quelque chose comme ceci:
$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)
}
}
il y a 3 façons de créer un répertoire en utilisant PowerShell
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"
lorsque vous spécifiez le drapeau -Force
, PowerShell ne se plaindra pas si le dossier existe déjà.
One-liner:
Get-ChildItem D:\TopDirec\SubDirec\Project* | `
%{ Get-ChildItem $_.FullName -Filter Revision* } | `
%{ New-Item -ItemType Directory -Force -Path (Join-Path $_.FullName "Reports") }
BTW, pour programmer la tâche s'il vous plaît consulter ce lien: programmer des travaux de fond .
l'extrait de code suivant vous aide à créer le chemin complet.
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"
}
}
}
au-dessus de la fonction divise le chemin que vous avez passé à la fonction, et vérifiera chaque dossier s'il a existé ou non. Si elle n'existe pas, elle créera le dossier respectif jusqu'à ce que le dossier cible/final soit créé.
pour appeler la fonction, utilisez la déclaration suivante:
GenerateFolder "H:\Desktop\Nithesh\SrcFolder"
de votre situation est des sons comme vous avez besoin de créer un dossier" Révision# "une fois par jour avec un dossier" Rapports " là-dedans. Si c'est le cas, vous avez juste besoin de savoir quel est le prochain numéro de révision. Écrivez une fonction qui obtient le prochain numéro de révision Get-NextRevisionNumber. Ou vous pourriez faire quelque chose comme ceci:
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.
}
je voulais être capable de laisser les utilisateurs créer facilement un profil par défaut pour PowerShell pour outrepasser certains réglages, et j'ai fini avec la doublure suivante (déclarations multiples Oui, mais peut être collé dans PowerShell et exécuté en même temps, ce qui était le but principal):
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!' };
pour plus de lisibilité, voici comment je le ferais dans un fichier ps1 à la place:
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";
};
en Voilà un simple qui a marché pour moi. Il vérifie si le chemin existe, et s'il n'existe pas, il crée non seulement le chemin racine, mais aussi tous les sous-répertoires:
$rptpath = "C:\temp\reports\exchange"
if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}
$path = "C:\temp\"
If(!(test-path $path))
{md C:\Temp\}
-
la première ligne crée une variable appelée
$path
et lui attribue la valeur de chaîne de "C:\temp\ " -
Deuxième ligne
If
déclaration qui s'appuie sur Test-Chemin de l'applet de commande pour vérifier si la variable$path
n'existe PAS. Le non existe est qualifié en utilisant le symbole!
-
troisième ligne: si le chemin stocké dans la chaîne ci-dessus N'est pas trouvé, le code entre les crochets bouclés sera exécuté
md
est la version courte de Dactylographie: New-Item -ItemType Directory -Path $path
Note: je n'ai pas testé le paramètre -Force
avec le paramètre ci-dessous pour voir s'il y a un comportement indésirable si le chemin existe déjà.
New-Item -ItemType Directory -Path $path