J'écris un script PowerShell pour créer plusieurs répertoires s'ils n'existent pas.
Le système de fichiers ressemble à ceci
D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
J'ai besoin d'écrire un script qui s'exécute quotidiennement pour créer ces dossiers pour chaque répertoire.
Je suis capable d'écrire le script pour créer un dossier, mais la création de plusieurs dossiers est problématique.
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 d'abord.
Voir l'article New-Item MSDN Help 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. Si ce n'est pas le cas, un nouveau répertoire sera créé.
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)
}
}
Lorsque vous spécifiez l'indicateur -Force
, PowerShell ne se plaindra pas si le dossier existe déjà.
Bon mot:
Get-ChildItem D:\TopDirec\SubDirec\Project* | `
%{ Get-ChildItem $_.FullName -Filter Revision* } | `
%{ New-Item -ItemType Directory -Force -Path (Join-Path $_.FullName "Reports") }
BTW, pour la planification de la tâche, veuillez consulter ce lien: Planification des tâches en arrière-plan .
L'extrait de code suivant vous aide à créer un 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"
}
}
}
La fonction ci-dessus divise le chemin que vous avez donné à la fonction et vérifie chaque dossier s'il existe ou non. S'il n'existe pas, il créera le dossier correspondant jusqu'à ce que le dossier cible/final soit créé.
Pour appeler la fonction, utilisez l'instruction ci-dessous:
GenerateFolder "H:\Desktop\Nithesh\SrcFolder"
Dans votre situation, il semble que vous deviez créer un dossier "Revision #" une fois par jour avec un dossier "Reports". Si tel est le cas, il vous suffit de connaître le numéro de la prochaine révision. Ecrivez une fonction qui obtient le numéro de révision suivant Get-NextRevisionNumber. Ou vous pourriez faire quelque chose comme ça:
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 souhaitais permettre aux utilisateurs de créer facilement un profil par défaut pour PowerShell, afin de remplacer certains paramètres. ):
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";
};
Voici un simple qui a fonctionné pour moi. Il vérifie si le chemin existe, et si ce n'est pas le cas, il créera non seulement le chemin racine, mais également 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 nommée $path
et lui attribue la valeur de chaîne "C:\temp \".
La deuxième ligne est une instruction If
qui s'appuie sur l'applet de commande Test-Path pour vérifier si la variable $path
n'existe PAS. Le not existe est qualifié à l'aide du symbole !
Troisième ligne: SI le chemin stocké dans la chaîne ci-dessus N'EST PAS trouvé, le code entre les accolades sera exécuté
md
est la version abrégée de la saisie: New-Item -ItemType Directory -Path $path
Remarque: je n'ai pas testé l'utilisation du paramètre -Force
avec l'option ci-dessous pour voir s'il existe un comportement indésirable si le chemin existe déjà.
New-Item -ItemType Directory -Path $path