私はいくつかのディレクトリが存在しない場合はそれらを作成するためのPowerShellスクリプトを書いています。
ファイルシステムはこれに似ています
D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
各ディレクトリにこれらのフォルダを作成するために毎日実行するスクリプトを書く必要があります。
私はフォルダを作成するスクリプトを書くことができますが、いくつかのフォルダを作成することは問題があります。
-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
はパスが存在するかどうかを確認します。そうでない場合は、新しいディレクトリを作成します。
私はまったく同じ問題を抱えていました。あなたはこのようなものを使うことができます:
$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") }
ところで、タスクをスケジュールするためにこのリンクをチェックしてください: バックグラウンドジョブのスケジューリング 。
次のコードスニペットは、完全パスを作成するのに役立ちます。
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"
}
}
}
上記の関数は関数に渡したパスを分割し、各フォルダが存在するかどうかを確認します。存在しない場合は、target/finalフォルダが作成されるまでそれぞれのフォルダを作成します。
関数を呼び出すには、下記の文を使用してください。
GenerateFolder "H:\Desktop\Nithesh\SrcFolder"
あなたの状況から、あなたがそこに "レポート"フォルダと一日一回 "リビジョン#"フォルダを作成する必要があるように聞こえます。その場合は、次のリビジョン番号が何であるかを知る必要があります。次のリビジョン番号を取得する関数を書く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は、いくつかの設定を上書きするため、ユーザーはデフォルトのプロファイルを作成してみましょうすることになりたかった、とはい複数のステートメント(以下ワンライナーで終わったが、主な目標であった、一度の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";
};
これは私のために働いた簡単なものです。パスが存在するかどうかをチェックし、存在しない場合はルートパスだけでなくすべてのサブディレクトリも作成します。
$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\}
1行目で$path
という名前の変数を作成し、それに "C:\ temp \"という文字列値を割り当てます。
2行目は、変数$path
が存在しないかどうかを確認するためにTest-Pathコマンドレットに依存するIf
ステートメントです。存在しないものは!
シンボルを使用して修飾されます
3行目:上記の文字列に格納されているパスが見つからない場合は、波かっこの間のコードが実行されます。
md
は、入力の短縮形です。New-Item -ItemType Directory -Path $path
注:パスが既に存在する場合に望ましくない動作がないかどうかを確認するために、以下で-Force
パラメーターを使用してテストしていません。
New-Item -ItemType Directory -Path $path