{"id":54083,"date":"2009-03-30T21:29:00","date_gmt":"2009-03-30T21:29:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2009\/03\/30\/hey-scripting-guy-how-can-i-create-a-scheduled-task-on-a-number-of-computers\/"},"modified":"2009-03-30T21:29:00","modified_gmt":"2009-03-30T21:29:00","slug":"hey-scripting-guy-how-can-i-create-a-scheduled-task-on-a-number-of-computers","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/scripting\/hey-scripting-guy-how-can-i-create-a-scheduled-task-on-a-number-of-computers\/","title":{"rendered":"Hey, Scripting Guy! How Can I Create a Scheduled Task on a Number of Computers?"},"content":{"rendered":"<p><H2><IMG class=\"nearGraphic\" title=\"Hey, Scripting Guy! Question\" border=\"0\" alt=\"Hey, Scripting Guy! Question\" align=\"left\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/q-for-powertip.jpg\" width=\"34\" height=\"34\"> <\/H2>\n<P>Hey, Scripting Guy! I have to be able to create a simple scheduled task via script on a number of computers. I do not need to do anything fancy, but it needs to be quick and easy to do. Do you have any ideas that can help me?<BR><BR>&#8211; JW<\/P><IMG border=\"0\" alt=\"Spacer\" src=\"https:\/\/devblogs.microsoft.com\/scripting\/wp-content\/uploads\/sites\/29\/2019\/05\/spacer.gif\" width=\"5\" height=\"5\"><IMG class=\"nearGraphic\" title=\"Hey, Scripting Guy! Answer\" border=\"0\" alt=\"Hey, Scripting Guy! Answer\" align=\"left\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/a-for-powertip.jpg\" width=\"34\" height=\"34\"> \n<P>Hi JW,<\/P>\n<P>The word for the day is blue. We have a nice pot of green tea, and we crushed some organic blueberries and placed them in the tea. It adds a nice color and flavor to the tea. We are also listening to <A href=\"http:\/\/music.msn.com\/music\/artist\/avenue-blue\/\" target=\"_blank\">Avenue Blue<\/A>. The sky is a deep blue, and the birds are singing. Somewhere in the distance, a wind chime is punctuating the breeze and adding a nice relaxed tempo to the world outside our office. In the midst of this tranquility, you would like to create a quick, scheduled job? No problem.<\/P>\n<TABLE id=\"E3C\" class=\"dataTable\" cellSpacing=\"0\" cellPadding=\"0\">\n<THEAD><\/THEAD>\n<TBODY>\n<TR class=\"record\" vAlign=\"top\">\n<TD>\n<P class=\"lastInCell\">This week we are talking about scheduled tasks. There are at least three different ways that you can work with scheduled tasks. <A href=\"http:\/\/www.microsoft.com\/technet\/scriptcenter\/resources\/qanda\/sept04\/hey0922.mspx\" target=\"_blank\">This \u201cHey, Scripting Guy!\u201d article<\/A> provides an example of working with scheduled tasks via WMI. <A href=\"http:\/\/www.microsoft.com\/technet\/scriptcenter\/scripts\/msh\/os\/tasks\/ostkms04.mspx\" target=\"_blank\">This script<\/A> lists scheduled tasks created via WMI. We also have <A href=\"http:\/\/www.microsoft.com\/technet\/scriptcenter\/csc\/scripts\/os\/tasks\/index.mspx\" target=\"_blank\">a variety of scheduled task scripts<\/A> from the Community-Submitted Scripts Center. The <B>Schedule.Service<\/B> API is discussed in two articles. The <A href=\"http:\/\/www.microsoft.com\/technet\/scriptcenter\/topics\/vista\/tasks1.mspx\" target=\"_blank\">first article<\/A> talks about creating a task and setting the trigger. The <A href=\"http:\/\/www.microsoft.com\/technet\/scriptcenter\/topics\/vista\/tasks2.mspx\" target=\"_blank\">second article<\/A> discusses organizing tasks. <A href=\"http:\/\/www.microsoft.com\/technet\/scriptcenter\/resources\/qanda\/aug07\/hey0830.mspx\" target=\"_blank\">This article<\/A> discusses executing scheduled tasks via the <B>Schedule.Service<\/B> API. And the task scheduler is documented <A href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/aa383614.aspx\" target=\"_blank\">on MSDN<\/A>.<\/P><\/TD><\/TR><\/TBODY><\/TABLE>\n<DIV class=\"dataTableBottomMargin\"><\/DIV>\n<P>JW, we created the <B>CreateScheduledTask.ps1<\/B> script for you to use to create quick, scheduled jobs. This script uses the WMI class <B>Win32_ScheduledJob<\/B>, which supports the older scheduled-job engine. This engine does not have the flexibility of the <B>Schedule.Service<\/B> API, but what it lacks in flexibility it makes up for in simplicity. The <B>CreateScheduledTask.ps1<\/B> script is seen here:<\/P><PRE class=\"codeSample\">param(\n      $computer=$env:computername,\n      $command,\n      $startTime,\n      [switch]$repeat,\n      $daysOfWeek,\n      $DaysOfMonth,\n      [switch]$interactWithDesktop,\n      [switch]$help\n      ) #end param<\/p>\n<p>function Help\n{\n $descriptionText= `\n@&#8221;\n NAME: CreateScheduledTask.ps1\n DESCRIPTION:\n Creates a scheduled job on a local or remote \n machine. The scheduled job can run once, or\n be scheduled to run repeatedly on a particular\n day of the week, or on a particular day of the\n month. NOTE: requires administrator rights<\/p>\n<p> PARAMETERS: \n -computer computer upon which to run the command\n -command the command to run\n -startTime the date and time to run the command\n -repeat when present, causes job to repeat\n -daysOfWeek the day of the week to run the job &lt; 1-7&gt;\n -daysOfMonth the day of the month to run the job &lt; 1 &#8211; 31 &gt;\n -interactWithDeskTop causes job to interact with desktop\n -help prints help description and parameters file\n&#8220;@ #end descriptionText<\/p>\n<p>$examplesText= `\n@&#8221;<\/p>\n<p> SYNTAX:\n CreateScheduledTask.ps1 <\/p>\n<p> Displays an error missing parameter, and calls help<\/p>\n<p> CreateScheduledTask.ps1  -command notepad -startTime &#8216;1\/26\/2008 6:18 pm&#8217;<\/p>\n<p> Creates a scheduled job to run notepad at 6:18 pm Jan 26, 2008 on the local\n machine. The notepad process does not interact with the desktop. <\/p>\n<p> CreateScheduledTask.ps1  -command notepad -startTime &#8216;1\/26\/2008 6:18 pm&#8217;\n -interactWithDesktop<\/p>\n<p> Creates a scheduled job to run notepad at 6:18 pm Jan 26, 2008 on the local\n machine. The notepad process interacts with the desktop.<\/p>\n<p> CreateScheduledTask.ps1  -command notepad -startTime &#8216;1\/26\/2008 6:18 pm&#8217;\n -repeat -daysOfWeek 4<\/p>\n<p> Creates a scheduled job to run notepad at 6:18 pm Jan 26, 2008 on the local\n machine. The notepad process does not interact with the desktop. The job runs\n repeatedly every thursday at the same time.<\/p>\n<p> CreateScheduledTask.ps1  -command notepad -startTime &#8216;1\/26\/2008 6:18 pm&#8217;\n -repeat -daysOfMonth 26<\/p>\n<p> Creates a scheduled job to run notepad at 6:18 pm Jan 26, 2008 on the local\n machine. The notepad process does not interact with the desktop. The job runs\n repeatedly every month on the 26th at the same time.\n&#8220;@\n $descriptionText ; $examplesText\n} #end help<\/p>\n<p>Function ScheduleJob()\n{\n if($daysOfWeek) { $daysOfWeek = [math]::pow(2,$daysOfWeek -1) }\n if($daysOfMonth){ $daysOfMonth = [math]::pow(2,$daysOfMonth -1) }\n $sJob = [wmiclass]&#8221;\\\\$computer\\root\\cimv2:win32_scheduledjob&#8221;\n if($startTime) { $startTime = $sJob.ConvertFromDateTime($startTime) }\n if(!$startTime) { &#8220;you must supply a time for the job to run&#8221; ; funhelp }\n $errRTN = $sJob.Create($command,$startTime,$repeat,$daysOfWeek,$daysOfMonth,$interactWithDesktop)\n if($errRTN.returnValue -eq 0) \n   { \n    &#8220;$command successfully created as job $($errRTN.jobID) on $computer&#8221;\n   } #end if\n ELSE\n   {\n     &#8220;Failed to create $command as a scheduled job on $computer. Error $($errRTN.returnvalue&#8221;\n   }\n} #end ScheduleJob\n# *** Entry point to script ***\nif($help)      { help; exit }\nif($command)   { ScheduleJob }\nif(!$command) { &#8220;Missing command &#8230; &#8221; ; help; exit }\n<\/PRE>\n<P>JW, do not let the length of the script scare you. It contains mostly text that is used for the Help strings. The first thing we need to do is to define some command-line parameters. This will allow us a lot of flexibility when running the script. To do this, we use the <B>param<\/B> statement. The <B>param<\/B> statement is followed by a set of parentheses; each of the parameters is assigned on its own line followed by a comma. Each parameter does not have to be on its own line; however, doing so makes it easier to read and to understand when a large number of parameters are involved. Three of the parameters are switched parameters. A switched parameter is a parameter that does not take effect unless it is present on the command line. We create a parameter by using the <B>switch<\/B> statement inside a pair of square brackets. The <B>switch<\/B> statement as used here is really a system value type. The <B>param<\/B> statement for our script is shown here:<\/P><PRE class=\"codeSample\">param(\n      $computer=$env:computername,\n      $command,\n      $startTime,\n      [switch]$repeat,\n      $daysOfWeek,\n      $DaysOfMonth,\n      [switch]$interactWithDesktop,\n      [switch]$help\n      ) #end param\n<\/PRE>\n<P>Because we have a large number of command-line parameters, I consider it a best practice to include some Help for the script. To do this, we will create a <B>help<\/B> function to provide the Help for the script. This <B>help<\/B> function will only be called when the script is run with the <B>-help<\/B> argument from the command line. The <B>help<\/B> function displays text on the command line that consists of two rather large <B>here-strings<\/B>. To create a <B>here-string<\/B>, we begin with an ampersand and a double quotation mark. The <B>here-string<\/B> ends with a pair of double quotation marks followed by an ampersand. We then store the <B>here-string<\/B> in a variable. After we have created our two <B>help-strings<\/B>, we print both of them out and exit the <B>help<\/B> function. The <B>$descriptionText here-string<\/B> is shown here:<\/P><PRE class=\"codeSample\">function Help\n{\n $descriptionText= `\n@&#8221;\n NAME: CreateScheduledTask.ps1\n DESCRIPTION\n Creates a scheduled job on a local or remote \n machine. The scheduled job can run once, or\n be scheduled to run repeatedly on a particular\n day of the week, or on a particular day of the\n month. NOTE: requires administrator rights\n PARAMETERS: \n -computer computer upon which to run the command\n -command the command to run\n -startTime the date and time to run the command\n -repeat when present, causes job to repeat\n -daysOfWeek the day of the week to run the job &lt; 1-7&gt;\n -daysOfMonth the day of the month to run the job &lt; 1 &#8211; 31 &gt;\n -interactWithDeskTop causes job to interact with desktop\n -help prints help description and parameters file\n&#8220;@ #end descriptionText\n<\/PRE>\n<P>We now create another <B>here-string<\/B>. Once again we begin the <B>here-string<\/B> with the ampersand and the double quotation mark. We store the <B>here-string<\/B> in a variable named <B>$examplesText<\/B>. This is seen here:<\/P><PRE class=\"codeSample\">$examplesText= `\n@&#8221;\n SYNTAX:\n CreateScheduledTask.ps1\n Displays an error missing parameter, and calls help\n CreateScheduledTask.ps1  -command notepad -startTime &#8216;1\/26\/2008 6:18 pm&#8217;\n Creates a scheduled job to run notepad at 6:18 pm Jan 26, 2008 on the local\n machine. The notepad process does not interact with the desktop.\n CreateScheduledTask.ps1  -command notepad -startTime &#8216;1\/26\/2008 6:18 pm&#8217;\n -interactWithDesktop\n Creates a scheduled job to run notepad at 6:18 pm Jan 26, 2008 on the local\n machine. The notepad process interacts with the desktop\n CreateScheduledTask.ps1  -command notepad -startTime &#8216;1\/26\/2008 6:18 pm&#8217;\n -repeat -daysOfWeek 4\n Creates a scheduled job to run notepad at 6:18 pm Jan 26, 2008 on the local\n machine. The notepad process does not interact with the desktop. The job runs\n repeatedly every thursday at the same time.\n CreateScheduledTask.ps1  -command notepad -startTime &#8216;1\/26\/2008 6:18 pm&#8217;\n -repeat -daysOfMonth 26\nCreates a scheduled job to run notepad at 6:18 pm Jan 26, 2008 on the local\nmachine. The notepad process does not interact with the desktop. The job runs\n repeatedly every month on the 26th at the same time.\n&#8220;@\n<\/PRE>\n<P>To print out the <B>help<\/B> strings, we only need to print the contents of the two variables. The first variable contains the description information. The semicolon is used to separate the two different commands that would normally appear on their own individual lines. This convention simply shows that we are printing both items out. It does not change the behavior of the script. The <B>help<\/B> function ends with the curly bracket. This is shown here:<\/P><PRE class=\"codeSample\">$descriptionText ; $examplesText\n} #end help\n<\/PRE>\n<P>When the <B>help<\/B> function is called, either by running the script with the <B>\u2013help<\/B> switch or by running the script with no switches at all, the Help information is displayed:<\/P><IMG border=\"0\" alt=\"Image of the displayed Help information\" src=\"http:\/\/img.microsoft.com\/library\/media\/1033\/technet\/images\/scriptcenter\/qanda\/hsg\/2009\/march\/hey0330\/hsg-03-30-09-01.jpg\" width=\"500\" height=\"427\"> \n<P>&nbsp;<\/P>\n<P>After we have completed the <B>help<\/B> function, it is time to create the <B>scheduled job<\/B> function. This is the main function for our script. The <B>scheduled job<\/B> function begins with the <B>function<\/B> keyword and the name of the function. It then continues with an open curly bracket and an <B>if<\/B> statement. The <B>if<\/B> statement is used to evaluate the value that is contained in the <B>$daysOfWeek<\/B> variable. If a value for the <B>$daysOfWeek<\/B> variable is present when the script is launched, the <B>if<\/B> statement will be executed. The script block uses the static method <B>pow<\/B>. The <B>pow<\/B> method accepts two parameters. The first parameter is the number base and the second parameter is the number itself. An example of using this method is seen here:<\/P><PRE class=\"codeSample\">PS C:\\&gt; [math]::pow(2,3)\n8\n<\/PRE>\n<P>The reason we need to use this method is because of the way the <B>scheduled job<\/B> method needs to accept the input value. Essentially what we are doing is taking a numeric value and converting it to base two. For more information, take a look at <A href=\"http:\/\/www.microsoft.com\/technet\/scriptcenter\/guide\/sas_man_rsxs.mspx\" target=\"_blank\">this article<\/A>.<\/P><PRE class=\"codeSample\">Function ScheduleJob()\n{\n if($daysOfWeek) { $daysOfWeek = [math]::pow(2,$daysOfWeek -1) }\n<\/PRE>\n<P>When a value for the <B>$daysofweek<\/B> variable is present, it means it was supplied on the command line. We use an <B>if<\/B> statement to detect its presence. If we find a value, the script block will be executed. The syntax is exactly the same used for the <B>$daysofweek<\/B> variable. This command is seen here:<\/P><PRE class=\"codeSample\">if($daysOfMonth){ $daysOfMonth = [math]::pow(2,$daysOfMonth -1) }\n<\/PRE>\n<P>We now need to create an instance of the WMI class <B>Win32_scheduledJob<\/B>. To do this we use the WMI class accelerator. We specify the computer name and the WMI namespace. The WMI object that is returned is stored in the variable <B>$sjob<\/B>. This syntax is shown here:<\/P><PRE class=\"codeSample\">$sJob = [wmiclass]&#8221;\\\\$computer\\root\\cimv2:win32_scheduledjob&#8221;\n<\/PRE>\n<P>We now need to create the <B>date time<\/B> value that is required by the <B>scheduled job<\/B> class. To do this we use the <B>ConvertFromDateTime<\/B> method. The <B>ConvertFromDateTime<\/B> method will accept a string that represents the date and the time that you wish the scheduled job to occur. It will then convert that string into the acceptable format for WMI. This command is shown here:<\/P><PRE class=\"codeSample\">if($startTime) { $startTime = $sJob.ConvertFromDateTime($startTime) }\n<\/PRE>\n<P>We are now going to check to see if a value has been supplied for the starting time of the scheduled job. If no value is present, we\u2019ll print out a message and call the <B>help<\/B> function as seen here:<\/P><PRE class=\"codeSample\">if(!$startTime) { &#8220;you must supply a time for the job to run&#8221; ; help }\n<\/PRE>\n<P>It is time to call the <B>create<\/B> method of the <B>scheduled job <\/B>class and pass the parameters to it. The first parameter is the command we wish to execute. The command is contained in the <B>$command<\/B> variable. The second parameter is the starting time of the scheduled job; this value contains the converted value that is stored in the <B>$startTime<\/B> value. The third parameter, <B>$repeat<\/B>, tells the command whether or not we wish to repeat the job. The <B>$daysOfWeek<\/B> variable contains the days of the week on which we wish the job to occur. This value only takes effect if the <B>repeat<\/B> flag has been selected. The <B>$daysOfMonth<\/B> value is used to tell the job on which days of the month we wish for it to occur. Once again this value only takes effect if the <B>repeat<\/B> flag has been used. The <B>$interactWithDeskTop<\/B> variable is a Boolean value that tells the job engine whether or not to allow access to the desktop. If this value is not used, a program such as Notepad.exe will not be visible when launched by the scheduled task. WMI will return a value that tells us if the command was successful. The value of zero means there were no errors; any other value would indicate an error during the method call. The method call is seen here:<\/P><PRE class=\"codeSample\">$errRTN = $sJob.Create($command,$startTime,$repeat,$daysOfWeek,$daysOfMonth,$interactWithDesktop)\n<\/PRE>\n<P>We want to evaluate the return code. To do this we look at the return value that is stored in the <B>$errRTN<\/B> variable. If the return code is 0, it means the command completed successfully. This is shown here:<\/P><PRE class=\"codeSample\">if($errRTN.returnValue -eq 0)\n   {\n    &#8220;$command successfully created as job $($errRTN.jobID) on $computer&#8221;\n   } #end if\n<\/PRE>\n<P>On the other hand, any number other than 0 indicates that an error occurred. We therefore print out a message that the command failed, as well as the error number itself. This is seen here:<\/P><PRE class=\"codeSample\">ELSE\n   {\n     &#8220;Failed to create $command as a scheduled job on $computer. Error $($errRTN.returnvalue&#8221;\n   }\n} #end ScheduleJob\n<\/PRE>\n<P>&nbsp;<\/P>\n<P>When the script is run and it is successful, we are presented with the confirmation seen here:<\/P><IMG border=\"0\" alt=\"Image of the confirmation that the script ran successfully\" src=\"http:\/\/img.microsoft.com\/library\/media\/1033\/technet\/images\/scriptcenter\/qanda\/hsg\/2009\/march\/hey0330\/hsg-03-30-09-02.jpg\" width=\"500\" height=\"86\"> \n<P>&nbsp;<\/P>\n<P>One of the things we do not like about the script is the number of command-line parameters that are required to create a scheduled job. There are two things that can be done; the first is to use partial parameters when calling the script. As seen in the following image, the first attempt failed because <B>\u2013c<\/B> is ambiguous. It could mean computer or command. The second attempt works:<\/P><IMG border=\"0\" alt=\"Image of the failed first attempt\" src=\"http:\/\/img.microsoft.com\/library\/media\/1033\/technet\/images\/scriptcenter\/qanda\/hsg\/2009\/march\/hey0330\/hsg-03-30-09-03.jpg\" width=\"500\" height=\"140\"> \n<P>&nbsp;<\/P>\n<P>The second thing that could be done is to add the values for the command line as variables in the script. You would do this just before the entry point to the script. <\/P><PRE class=\"codeSample\">$command = &#8220;Notepad&#8221;\n$startTime = &#8220;3\/30\/2009 11:50 am&#8221;\n$interactWithDeskTop = $true\n<\/PRE>\n<P>In this manner, you would be able to run the script directly without needing to type any information on the command line. The entry point of the script is used to check the command-line parameters. If the script was run with the <B>\u2013help<\/B> parameter, the <B>help <\/B>function will be called and the script will exit. If the script was run and no value was given to the script for the <B>\u2013command<\/B> parameter and the <B>\u2013help<\/B> parameter was not supplied, the script displays a message that states that it is missing a command and it calls the <B>help<\/B> function and then exits. If the <B>\u2013help<\/B> parameter is not supplied and if the <B>command<\/B> parameter was supplied, the <B>scheduled job<\/B> function is called. This is seen here:<\/P><PRE class=\"codeSample\">if($help)      { help; exit }\nif($command)   { ScheduleJob }\nif(!$command) { &#8220;Missing command &#8230; &#8221; ; help; exit }\n<\/PRE>\n<P>When&nbsp;the script has run, you can use the <B>At<\/B> command to see the status of the scheduled jobs. This is seen here:<\/P><IMG border=\"0\" alt=\"Image of the At command used to see the status of scheduled jobs\" src=\"http:\/\/img.microsoft.com\/library\/media\/1033\/technet\/images\/scriptcenter\/qanda\/hsg\/2009\/march\/hey0330\/hsg-03-30-09-04.jpg\" width=\"500\" height=\"104\"> \n<P>&nbsp;<\/P>\n<P>We have come to the end of our discussion of using the legacy task scheduler via Windows PowerShell. As you can see, it is easy to use but is somewhat limited in its options. Join us tomorrow as we continue our series of articles about scheduling tasks. Until tomorrow, peace. <\/P>\n<P>&nbsp;<\/P>\n<P><B>Ed Wilson and Craig Liebendorfer, Scripting Guys<\/B><\/P><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hey, Scripting Guy! I have to be able to create a simple scheduled task via script on a number of computers. I do not need to do anything fancy, but it needs to be quick and easy to do. Do you have any ideas that can help me?&#8211; JW Hi JW, The word for the [&hellip;]<\/p>\n","protected":false},"author":595,"featured_media":87096,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[31,32,3,45],"class_list":["post-54083","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scripting","tag-operating-system","tag-scheduled-tasks","tag-scripting-guy","tag-windows-powershell"],"acf":[],"blog_post_summary":"<p>Hey, Scripting Guy! I have to be able to create a simple scheduled task via script on a number of computers. I do not need to do anything fancy, but it needs to be quick and easy to do. Do you have any ideas that can help me?&#8211; JW Hi JW, The word for the [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/54083","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/users\/595"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/comments?post=54083"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/54083\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media\/87096"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media?parent=54083"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/categories?post=54083"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/tags?post=54083"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}