{"id":55643,"date":"2008-05-03T01:30:00","date_gmt":"2008-05-03T01:30:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2008\/05\/03\/hey-scripting-guy-how-can-i-identify-the-20-most-recently-modified-files-in-a-folder\/"},"modified":"2008-05-03T01:30:00","modified_gmt":"2008-05-03T01:30:00","slug":"hey-scripting-guy-how-can-i-identify-the-20-most-recently-modified-files-in-a-folder","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/scripting\/hey-scripting-guy-how-can-i-identify-the-20-most-recently-modified-files-in-a-folder\/","title":{"rendered":"Hey, Scripting Guy! How Can I Identify the 20 Most-Recently Modified Files in a Folder?"},"content":{"rendered":"<p><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\"> \n<P>Hey, Scripting Guy! I Using VBScript, how can I identify the 20 most-recently modified files in a folder?<BR>&#8212; TW<\/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\"><A href=\"http:\/\/go.microsoft.com\/fwlink\/?linkid=68779&amp;clcid=0x409\"><IMG class=\"farGraphic\" title=\"Script Center\" border=\"0\" alt=\"Script Center\" align=\"right\" src=\"http:\/\/img.microsoft.com\/library\/media\/1033\/technet\/images\/scriptcenter\/ad.jpg\" width=\"120\" height=\"288\"><\/A> \n<P>Hey, TW. You know, the Scripting Guy who writes this column was just reading \u2013 thanks to the magic of Spam email \u2013 about a new voice mail service. With this service you don\u2019t have to listen to all those annoying voice mails; instead, whenever someone leaves you a voice mail a piece of software \u201clistens\u201d to that voice mail and then sends you an email or text message summarizing the voice mail. This is considered \u201crevolutionary,\u201d although, to be honest, the Scripting Guy who writes this column isn\u2019t exactly sure why it\u2019s \u201crevolutionary\u201d to receive a text message rather than a voice mail, but he\u2019ll take everyone\u2019s word for it. <\/P>\n<TABLE id=\"E1C\" class=\"dataTable\" cellSpacing=\"0\" cellPadding=\"0\">\n<THEAD><\/THEAD>\n<TBODY>\n<TR class=\"record\" vAlign=\"top\">\n<TD>\n<P><B>Note<\/B>. However, the Scripting Guy who writes this column <I>was<\/I> intrigued by a review of the service. The reviewer actually liked the service quite a bit, but he did mention the fact that the voice-to-text translation occasionally left something to be desired. \u201c\u2026when a friend left a message that said, \u2018My mom and I want to take you out to lunch and I wanted to see what you guys were in the mood for,\u2019&#8221; he noted, \u201cthe transcript came out as \u2018I&#8217;m on and I want you got goes up to lunch and I wanna see what you guys removed for.\u2019&#8221;<\/P>\n<P>And yes, as a matter of fact, we <I>do<\/I> use that very same piece of software when we write the <I>Hey, Scripting Guy!<\/I> column. How did you know?<\/P><\/TD><\/TR><\/TBODY><\/TABLE>\n<DIV class=\"dataTableBottomMargin\"><\/DIV>\n<P>At any rate, for awhile now we\u2019ve had software that can read your email, call you on the phone, and then read that email back to you. Now we have software that can take a voice mail and turn it into email. Which leads to an obvious question. Suppose the first piece of software reads an email, calls someone\u2019s cell phone, and leaves that email as a voice mail. Now, what do you think will happen if the second piece of software listens to the voice mail, converts it to email, and then emails that same message back to the first piece of software (which, of course, will then call you and try to read the email back to you)? Would life as we know it come to a sudden end?<\/P>\n<P>Well, let\u2019s hope so; after all, the past month hasn\u2019t exactly been seashells and balloons for the Scripting Guys.<\/P>\n<P>Of course, if cell phones can send email and email can make calls to cell phones you also have to wonder why these devices even <I>need<\/I> human beings. Does this mean that the human race is now doomed to extinction? Well, let\u2019s hope so; like we said, the past month hasn\u2019t exactly been seashells and balloons for the Scripting Guys.<\/P>\n<P>Besides, fewer people means fewer Christmas cards that the Scripting Guy who writes this column will have to send out this year.<\/P>\n<P>As far as we know, however, the human race is not yet extinct. That means two things: 1) the Scripting Guy who writes this column needs to hang onto his Christmas card list a little longer; and, 2) he also needs to come up with a script that can identify the 20 most-recently modified files in a folder. Fortunately, a script like that is the very thing that the Scripting Guy who writes this column sent out as a Christmas card this past year. Happy holidays, everyone:<\/P><PRE class=\"codeSample\">Const adVarChar = 200\nConst MaxCharacters = 255\nConst adFldIsNullable = 32<\/p>\n<p>strComputer = &#8220;.&#8221;<\/p>\n<p>Set objWMIService = GetObject(&#8220;winmgmts:\\\\&#8221; &amp; strComputer &amp; &#8220;\\root\\cimv2&#8221;)<\/p>\n<p>Set colFiles = objWMIService.ExecQuery _\n    (&#8220;ASSOCIATORS OF {Win32_Directory.Name=&#8217;C:\\Scripts&#8217;} Where &#8221; _\n        &amp; &#8220;ResultClass = CIM_DataFile&#8221;)<\/p>\n<p>Set DataList = CreateObject(&#8220;ADOR.Recordset&#8221;)\nDataList.Fields.Append &#8220;FileName&#8221;, adVarChar, MaxCharacters, adFldIsNullable\nDataList.Fields.Append &#8220;ModifiedDate&#8221;, adVarChar, MaxCharacters, adFldIsNullable\nDataList.Open<\/p>\n<p>For Each objFile In colFiles\n    DataList.AddNew\n    DataList(&#8220;FileName&#8221;) = objFile.Name\n    DataList(&#8220;ModifiedDate&#8221;) = objFile.LastModified\n    DataList.Update\nNext<\/p>\n<p>DataList.Sort = &#8220;ModifiedDate DESC&#8221;<\/p>\n<p>For i = 1 to 20\n    dtmWMIDate = DataList.Fields.Item(&#8220;ModifiedDate&#8221;)\n    dtmConvertedDate = CDate(Mid(dtmWMIDate, 5, 2) &amp; &#8220;\/&#8221; &amp; Mid(dtmWMIDate, 7, 2) &amp; _\n        &#8220;\/&#8221; &amp; Left(dtmWMIDate, 4) &amp; &#8221; &#8221; &amp; Mid (dtmWMIDate, 9, 2) &amp; &#8220;:&#8221; &amp; _\n            Mid(dtmWMIDate, 11, 2) &amp; &#8220;:&#8221; &amp; Mid(dtmWMIDate, 13, 2))\n    Wscript.Echo DataList.Fields.Item(&#8220;FileName&#8221;) &amp; &#8221; &#8212; &#8221; &amp; dtmConvertedDate\n    DataList.MoveNext\nNext\n<\/PRE>\n<P>As you can see, our script starts off by defining three constants, constants that will be required to create a disconnected recordset. <\/P>\n<TABLE id=\"E2D\" class=\"dataTable\" cellSpacing=\"0\" cellPadding=\"0\">\n<THEAD><\/THEAD>\n<TBODY>\n<TR class=\"record\" vAlign=\"top\">\n<TD>\n<P class=\"lastInCell\"><B>Note<\/B>. What\u2019s that? You didn\u2019t know we were going to use a disconnected recordset to tackle this problem? Sorry. As it turns out, that text message you got saying \u201cWhere groin Eustis this kinda wracks a sax\u201d was actually a voice mail from us saying \u201cWe\u2019re going to use a disconnected recordset.\u201d Obviously there are still a few kinks to be worked out here.<\/P><\/TD><\/TR><\/TBODY><\/TABLE>\n<DIV class=\"dataTableBottomMargin\"><\/DIV>\n<P>Anyway, the constant adVarChar will be used to create a pair of fields with a Variant data type; the constant MaxCharacters will set the maximum number of characters that can be stored in that field to 255. As for adFldIsNullable, well, that tells the script that it\u2019s OK to have a record with null values in it. We won\u2019t actually <I>have<\/I> any records with null values (unless we somehow encounter a file that has neither a file path nor a last modification date), but because adFldIsNullable is a useful thing to know about we decided to toss it in, just for the heck of it.<\/P>\n<P>After defining our constants we next connect to the WMI service on the local computer. And yes, as a matter of fact we <I>can<\/I> run this script against a remote computer; to do that, just assign the name of the remote computer to the variable strComputer. You know, like this:<\/P><PRE class=\"codeSample\">strComputer = &#8220;atl-fs-001&#8221;\n<\/PRE>\n<P>Once we\u2019re connected to the WMI service we can use the following query to retrieve a collection of all the files (instances of the <B>CIM_DataFile<\/B> class) found in the folder C:\\Scripts:<\/P><PRE class=\"codeSample\">Set colFiles = objWMIService.ExecQuery _\n    (&#8220;ASSOCIATORS OF {Win32_Directory.Name=&#8217;C:\\Scripts&#8217;} Where &#8221; _\n        &amp; &#8220;ResultClass = CIM_DataFile&#8221;)\n<\/PRE>\n<P>Of course, that leads to another obvious question: now that we have this collection of files what are we supposed to do with it? Well, for the moment at least, we\u2019re not going to do <I>anything<\/I> with it; instead, we\u2019re going to use this block of code to create a disconnected recordset (a database table that exists only in memory, and isn\u2019t tied to an actual database file):<\/P><PRE class=\"codeSample\">Set DataList = CreateObject(&#8220;ADOR.Recordset&#8221;)\nDataList.Fields.Append &#8220;FileName&#8221;, adVarChar, MaxCharacters, adFldIsNullable\nDataList.Fields.Append &#8220;ModifiedDate&#8221;, adVarChar, MaxCharacters, adFldIsNullable\nDataList.Open\n<\/PRE>\n<P>As you can see, there really isn\u2019t much to this block of code. In the first line we create an instance of the <B>ADOR.Recordset<\/B> object, the object used to create a disconnected recordset. In line 2, we create a variant field (with a maximum of 255 characters) named FileName; in line 3, we create a similar field named ModifiedDate. Finally, in line 4, we call the <B>Open<\/B> method to open the disconnected recordset and ready it for data entry.<\/P>\n<P>Whew. And to think we said that there wasn\u2019t much to that block of code!<\/P>\n<P>Now, back to our collection of files. (Remember, the collection of all the files found in the folder C:\\Scripts? The collection we just retrieved using the Associators Of query? Right, right: <I>that<\/I> collection of files.)<\/P>\n<P>What we\u2019re going to do now is loop through this collection, adding the path and last modified date for each file to our disconnected recordset. <I>Why<\/I> are we adding this information to a disconnected recordset? Well, we need to determine the 20 most-recently modified files; the only way we know of to do that is to grab <I>all<\/I> the files, sort them by the <B>LastModified<\/B> property, and then report back the first 20 items in the list. As far as the Scripting Guys are concerned, the easiest way to store all these files and then sort them by modification date is to stash all the information in a disconnected recordset.<\/P>\n<P>Which is just exactly what we do inside our For Each loop. To begin with, we call the <B>AddNew<\/B> method to create a new, blank record for our disconnected recordset; we then use these two lines of code to add the value of the file\u2019s <B>Name<\/B> and LastModified properties to our new record:<\/P><PRE class=\"codeSample\">DataList(&#8220;FileName&#8221;) = objFile.Name\nDataList(&#8220;ModifiedDate&#8221;) = objFile.LastModified\n<\/PRE>\n<P>As soon as we\u2019ve assigned values to the two fields (FileName and ModifiedDate) we call the <B>Update<\/B> method and add the record to the disconnected recordset:<\/P><PRE class=\"codeSample\">DataList.Update\n<\/PRE>\n<P>And then it\u2019s back to the top of the loop, where we repeat the process with the next file in the collection.<\/P>\n<P>Before we go any further let\u2019s talk about what these records actually look like. Better yet, and in keeping with the spirit of the times, let\u2019s <I>show<\/I> you what these records look like:<\/P>\n<TABLE id=\"ELG\" class=\"dataTable\" cellSpacing=\"0\" cellPadding=\"0\">\n<THEAD><\/THEAD>\n<TBODY>\n<TR class=\"record\" vAlign=\"top\">\n<TD>\n<P class=\"lastInCell\"><B>FileName<\/B><\/P><\/TD>\n<TD>\n<P class=\"lastInCell\"><B>ModifiedDate<\/B><\/P><\/TD><\/TR>\n<TR class=\"evenRecord\" vAlign=\"top\">\n<TD>\n<P class=\"lastInCell\">c:\\scripts\\add_access_rule.ps1<\/P><\/TD>\n<TD>\n<P class=\"lastInCell\">20080418125447.687500-420<\/P><\/TD><\/TR>\n<TR class=\"record\" vAlign=\"top\">\n<TD>\n<P class=\"lastInCell\">c:\\scripts\\enumerator.txt<\/P><\/TD>\n<TD>\n<P class=\"lastInCell\">20080429131114.380340-420<\/P><\/TD><\/TR>\n<TR class=\"evenRecord\" vAlign=\"top\">\n<TD>\n<P class=\"lastInCell\">c:\\scripts\\namechange.bat<\/P><\/TD>\n<TD>\n<P class=\"lastInCell\">20080423092144.906250-420<\/P><\/TD><\/TR>\n<TR class=\"record\" vAlign=\"top\">\n<TD>\n<P class=\"lastInCell\">c:\\scripts\\test.doc<\/P><\/TD>\n<TD>\n<P class=\"lastInCell\">20080422095053.703000-420<\/P><\/TD><\/TR>\n<TR class=\"evenRecord\" vAlign=\"top\">\n<TD>\n<P class=\"lastInCell\">c:\\scripts\\z.ps1<\/P><\/TD>\n<TD>\n<P class=\"lastInCell\">20080417150002.093750-420<\/P><\/TD><\/TR><\/TBODY><\/TABLE>\n<DIV class=\"dataTableBottomMargin\"><\/DIV>\n<P>The FileName field doesn\u2019t require much explanation; it\u2019s simply the path to the file in question. As for the ModifiedDate, well, strange as it might seem, that <I>is<\/I> the date that the file was last modified. WMI, as many of you know by now, doesn\u2019t use a standard date-time format; instead, it uses the UTC (Universal Time Coordinate) format. With the UTC format, date-time values are broken down like this:<\/P>\n<TABLE id=\"EZH\" class=\"dataTable\" cellSpacing=\"0\" cellPadding=\"0\">\n<THEAD><\/THEAD>\n<TBODY>\n<TR class=\"record\" vAlign=\"top\">\n<TD>\n<P class=\"lastInCell\"><B>Year<\/B><\/P><\/TD>\n<TD>\n<P class=\"lastInCell\"><B>Month<\/B><\/P><\/TD>\n<TD>\n<P class=\"lastInCell\"><B>Day<\/B><\/P><\/TD>\n<TD>\n<P class=\"lastInCell\"><B>Hour<\/B><\/P><\/TD>\n<TD>\n<P class=\"lastInCell\"><B>Minute<\/B><\/P><\/TD>\n<TD>\n<P class=\"lastInCell\"><B>Seconds<\/B><\/P><\/TD>\n<TD>\n<P class=\"lastInCell\"><B>Milliseconds<\/B><\/P><\/TD>\n<TD>\n<P class=\"lastInCell\"><B>Bias<\/B><\/P><\/TD><\/TR>\n<TR class=\"evenRecord\" vAlign=\"top\">\n<TD>\n<P class=\"lastInCell\">2008<\/P><\/TD>\n<TD>\n<P class=\"lastInCell\">04<\/P><\/TD>\n<TD>\n<P class=\"lastInCell\">18<\/P><\/TD>\n<TD>\n<P class=\"lastInCell\">12<\/P><\/TD>\n<TD>\n<P class=\"lastInCell\">54<\/P><\/TD>\n<TD>\n<P class=\"lastInCell\">47<\/P><\/TD>\n<TD>\n<P class=\"lastInCell\">.687500<\/P><\/TD>\n<TD>\n<P class=\"lastInCell\">-420<\/P><\/TD><\/TR><\/TBODY><\/TABLE>\n<DIV class=\"dataTableBottomMargin\"><\/DIV>\n<P>Admittedly, that\u2019s an odd way to format dates and times. On the bright side, however, it turns out to be a good way to <I>sort<\/I> dates and times. Consequently, we can enter these UTC values into our disconnected recordset as-is, then sort by ModifiedDate to determine the 20 files that were most-recently modified.<\/P>\n<P>In fact, that\u2019s what we do the moment we exit our For Each loop:<\/P><PRE class=\"codeSample\">DataList.Sort = &#8220;ModifiedDate DESC&#8221;\n<\/PRE>\n<P>All we\u2019re doing here is calling the <B>Sort<\/B> method followed by the field we want to sort on (ModifiedDate) and the DESC parameter, which tells the script to sort the recordset in descending order; that\u2019s how we make sure that the most-recently modified file winds up at the top of the list.<\/P>\n<P>After the files are sorted we can report back the 20 most-recently modified files by setting up a For Next loop that runs from 1 to 20:<\/P><PRE class=\"codeSample\">For i = 1 to 20\n<\/PRE>\n<P>Inside this For Next loop we start off by storing the value of the ModifiedDate field in a variable named dtmWMIDate; we then use this block of code to convert the UTC date to a <I>real<\/I> date-time value:<\/P><PRE class=\"codeSample\">dtmConvertedDate = CDate(Mid(dtmWMIDate, 5, 2) &amp; &#8220;\/&#8221; &amp; Mid(dtmWMIDate, 7, 2) &amp; _\n    &#8220;\/&#8221; &amp; Left(dtmWMIDate, 4) &amp; &#8221; &#8221; &amp; Mid (dtmWMIDate, 9, 2) &amp; &#8220;:&#8221; &amp; _\n        Mid(dtmWMIDate, 11, 2) &amp; &#8220;:&#8221; &amp; Mid(dtmWMIDate, 13, 2))\n<\/PRE>\n<P>We won\u2019t explain all that craziness in any detail today; suffice to say you can find a more complete explanation in the <A href=\"http:\/\/www.microsoft.com\/technet\/scriptcenter\/guide\/sas_wmi_yakv.mspx\"><B>Microsoft Windows 2000 Scripting Guide<\/B><\/A>. For now, we\u2019ll merely note that this block of code simply picks out and rearranges the individual date-time pieces found in the UTC value. In other words, it takes a UTC value like 20080430205414.000000-420 and magically transforms it into a date-time value like this: 4\/30\/2008 8:54:14 PM.<\/P>\n<P>Once the conversion has been made we can then echo back the file path and the last modified date:<\/P><PRE class=\"codeSample\">Wscript.Echo DataList.Fields.Item(&#8220;FileName&#8221;) &amp; &#8221; &#8212; &#8221; &amp; dtmConvertedDate\n<\/PRE>\n<P>And once <I>that\u2019s<\/I> done we call the <B>MoveNext<\/B> method to move to the next record in the recordset. By the time we exit the For Next loop we should see something similar to this onscreen:<\/P><PRE class=\"codeSample\">c:\\scripts\\test.txt &#8212; 4\/30\/2008 8:54:14 PM\nc:\\scripts\\names.txt &#8212; 4\/30\/2008 8:53:34 PM\nc:\\scripts\\subscriber.txt &#8212; 4\/30\/2008 1:09:16 PM\nc:\\scripts\\hey0501.doc &#8212; 4\/30\/2008 10:02:27 AM\nc:\\scripts\\test.xls &#8212; 4\/30\/2008 10:00:04 AM\nc:\\scripts\\enumerator.txt &#8212; 4\/29\/2008 1:11:14 PM\nc:\\scripts\\q1.vbs &#8212; 4\/28\/2008 10:26:16 PM\nc:\\scripts\\test.ps1 &#8212; 4\/28\/2008 9:46:11 PM\nc:\\scripts\\test 1.ps1 &#8212; 4\/26\/2008 10:36:45 PM\nc:\\scripts\\test.vbs &#8212; 4\/23\/2008 9:58:43 AM\nc:\\scripts\\namechange.bat &#8212; 4\/23\/2008 9:21:44 AM\nc:\\scripts\\test.doc &#8212; 4\/22\/2008 9:50:53 AM\nc:\\scripts\\remove_access_rule_all.ps1 &#8212; 4\/18\/2008 1:06:03 PM\nc:\\scripts\\remove_access_rule.ps1 &#8212; 4\/18\/2008 1:03:26 PM\nc:\\scripts\\add_access_rule.ps1 &#8212; 4\/18\/2008 12:54:47 PM\nc:\\scripts\\z.ps1 &#8212; 4\/17\/2008 3:00:02 PM\nc:\\scripts\\fv.ps1 &#8212; 4\/9\/2008 10:22:06 AM\nc:\\scripts\\temp.txt &#8212; 4\/4\/2008 10:50:55 AM\nc:\\scripts\\get_all.vbs &#8212; 4\/4\/2008 7:27:53 AM\nc:\\scripts\\os_info.vbs &#8212; 4\/3\/2008 5:55:16 PM\n<\/PRE>\n<P>In other words, we have the 20 files from the folder C:\\Scripts that were most-recently modified. It\u2019s everything you\u2019ve ever wanted!<\/P>\n<P>Well, OK. But it <I>is<\/I> information that\u2019s useful to TW.<\/P>\n<P>Regardless, that\u2019s all we have time for today. Before we go, however, and at the risk of tooting our own horn, we\u2019d like to point out that the Scripting Guys \u2013 as usual \u2013 are way ahead of the rest of the world. After all, you don\u2019t have to buy any special software or subscribe to a special service in order to receive <I>Hey, Scripting Guy!<\/I> in text format; far-sighted visionaries that we are, we already supply <I>Hey, Scripting Guy!<\/I> in text format.<\/P>\n<P>And yes, that\u2019s <I>exactly<\/I> why the Scripting Guys are where they are today. And deservedly so.<\/P><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hey, Scripting Guy! I Using VBScript, how can I identify the 20 most-recently modified files in a folder?&#8212; TW Hey, TW. You know, the Scripting Guy who writes this column was just reading \u2013 thanks to the magic of Spam email \u2013 about a new voice mail service. With this service you don\u2019t have to [&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":[38,3,12,5],"class_list":["post-55643","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scripting","tag-files","tag-scripting-guy","tag-storage","tag-vbscript"],"acf":[],"blog_post_summary":"<p>Hey, Scripting Guy! I Using VBScript, how can I identify the 20 most-recently modified files in a folder?&#8212; TW Hey, TW. You know, the Scripting Guy who writes this column was just reading \u2013 thanks to the magic of Spam email \u2013 about a new voice mail service. With this service you don\u2019t have to [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/55643","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=55643"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/55643\/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=55643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/categories?post=55643"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/tags?post=55643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}