Author Posts

January 1, 2012 at 12:00 am

by Captainu at 2013-02-05 04:05:12

I am looking at PowerShell for the first time and do not have a scripting background.

I am trying to create a small script to search for file types using variables. What I have so far is:

$Folder = N:\Users
$Ext = *.doc,*.exe
Get-ChildItem $Folder -Recurse -Include $Ext

If I run this I get nothing. If I only have one file extension in $Ext it works. If I type the extensions instead of using a variable it works. How can I put multiple extensions in the variable?

Im not looking for a script, I am doing this to learn more.

Regards

CU

by John.A.Mello at 2013-02-05 05:55:13

In order for the variable to know it has multiple entries you'll need to separate them with either to single or double quotes. So either :
$Ext = "*.doc","*.exe"
$Ext = '*.doc','*.exe'

Single quotes (' ') means to treat the enclosed information as a string
Double qoutes (" ")does the same thing but will extract values from variables if present. So if you did
$Ext = "*.doc","*.exe","$Folder"
the variable will have the following values :
[list]*.doc
*.exe
N]
You can verify that the variable has multiple values be testing if it's an array
$Ext -is [array]
If True, you have multiple values. If False it has 1 value or is empty.

by ArtB0514 at 2013-02-05 09:30:54

Likewise, you also have to put quote marks around the folder variable for it to work:
$Folder = "N]

A final note: Once you have the quote marks correct, your query will work, but only because you are using the -Recurse switch. If you were searching only a single folder, then you would have to include a wildcard character in order to get results.
Get-ChildItem $Folder\* -Include $Ext
The documentation for this is not easy to find -- it's in the examples for Get-Help Get-ChildItem:
[quote]C:\PS>get-childitem c:\windows\logs\* -include *.txt -exclude A*

Description
-----------
This command gets the .txt files in the Logs subdirectory, except for those whose names start with the letter A. It uses the wildcard character (*) to indicate the contents of the Logs subdirectory, not the directory container. Because the command does not include the Recurse parameter, Get-ChildItem does not include the contents of the current directory automatically; you need to specify it.
[/quote]