Troubleshooting PowerShell Functions

Part 1
Problem scenario:
  You have a PowerShell function that should add two parameter numbers and display their sum.  It is displaying the input when it should not.  No sum is being displayed.  There are no error messages. What should you do?
Solution:  Your code may look like this:

function contint ($a, $b) {
    $c = $a + $b
    return $c}

$d = contint (5, 2)
echo $d

The solution is to change the "$d = contint" line to be like this:
$d = contint 5 2
#With just spaces between the function name and its positional parameters, the PowerShell function will be invoked properly.

Part 2
Problem scenario:  You have a PowerShell function that is not working.  When you run the script that invokes it, you get an error like this:

"Select-String : Cannot bind argument to parameter 'Pattern' because it is null.
At C:\temp\contint1.ps1:2 char:34
+     $ca = cat $a | select-string $b
+                                  ~~
    + CategoryInfo          : InvalidData: (:) [Select-String], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.SelectStr
   ingCommand"

Here is the function in the script:
function contint ($a, $b) {
    $ca = cat $a | select-string $b
    return $c}

$d = contint ('C:\temp\foo.txt', 'alphaString')
echo $d

Solution:  The solution is to call the function without parentheses and without the comma like this:
function contint ($a, $b) {
    $ca = cat $a | select-string $b
    return $ca}

$d = contint 'C:\temp\foo.txt' 'alphaString'
echo $d
#  The single quotes on the string arguments are optional. 
# There can be no commas between the arguments when calling the function.

How To Troubleshoot the mkfs.ext4 Utility

Scenario / Goal: You are trying to add a hard drive (or new storage) to a Linux server.  You want the drive usable.  You attach the drive and use fdisk.  Now you want to use mkfs to create a file system on it.

Problem: You are trying to use mkfs.ext4 but you get this error:  "mkfs.ext4 no such file or directory while trying to determine filesystem size." 

Root cause: Wrong /dev/xxx argument.  This error message is misleading.

Use "cat /proc/partitions" to find the potential /dev/sdx options to choose from.  Then try your mkfs.ext4 command using a /dev/ item in the results of "cat /proc/partitions".  The problem should go away.

How To Install Pip On Red Hat version 6 with Python 2.7.x Installed

Goal:  You want to install pip on RedHat 6 with Python version 2.7.x installed.
Problem scenario:  
You try "yum install python-pipbut get an error about python(abi) = 2.6 being an unmet dependency.  Trying to install an older version may require you to downgrade other components.  The latest version of Python packages is often safer and recommended. 
Solution:  Obtain a copy of python-pip-7.1.0-1.el7.noarch.rpm.  Install it with yum.  This way you do not have to downgrade various components of Python.

Using Python and Ruby To Read Files

Problem:  You have a Python program that reads in a file named coolFile (in /tmp), and outputs the content to the screen.  The program prints an extra blank line after each line of content of the file named coolFile.  You want the output to not have an extra blank line.  Here is the code:

#/usr/bin/python

x = open("/tmp/coolFile", "r")
for line in x:
        print (line)

How do you have the output now print an extra blank line after each line?

Solution:  Insert a comma after the print (line) stanza.  Here is an example of source code that works:

#/usr/bin/python

x = open("/tmp/coolFile", "r")
for line in x:
        print (line),

Equivalent program in Ruby:  Here is the equivalent method in Ruby (a program that reads in a file, /tmp/coolFile, and prints each line out with no extra line):

#/usr/bin/ruby

File.readlines('/tmp/coolFile').each do |line|
    puts line
end

In PowerShell Diskpart Script Does Not Work (Despite No Error) Via “diskpart /s nameofscript.txt”

Goal:  To use a diskpart.exe script (a file of commands that could be ran interactively in sequence).
Problem:  When you run this command via PowerShell it does not work:  diskpart /s C:\Full\Path\script.txt
The result says something like "Microsoft DiskPart ..." and there is a list of alphabetic diskpart subcommands (ACTIVE to RECOVER).  There is no explicit error.  The diskpart command and script does no work.
Background:  When a PowerShell redirect (>) command is used to save a file, the default encoding is usually Unicode.  This encoding will not work for a diskpart script file (e.g., a .txt file of commands that could run interactively in sequence once diskpart is entered). 
Solution:  To resolve this, open the script, go to Save As, change the "Encoding" from "Unicode" to "ANSI."  Alternatively, if the diskpart script you are using is generated via PowerShell on an ongoing basis, use the Out-File and Encoding flags to designate the file to be ASCII.

How To Solve the PowerShell Error “The term ‘script’ is not recognized…”

Goal:  You want to run a .ps1 file.
Problem:  You get the error "Powershell : script : The term 'script' is not recognized as the name of a cmdlet, At line:1 char:1 + ..."
Solution:  Use the "script" resource section inside of a DSC configuration exclusively.  It will not work or run as a standalone PowerShell script.  Scripts with GetScript, SetScript, and TestScript must be run as part of a DSC configuration.  Also, DSC must be installed for configurations to work.  The "script" block should appear under the "configuration nameOfConfiguration" {} section of the .ps1 file.

One Way To Get Around The Error “Get-targetresource PS module does not implement the key property solution” in DSC

Goal:  Apply DSC configuration
Problem/scenario:   When you run the "start-dscconfiguration NameOfConfig -wait -verbose" (where NameOfConfig is the name of the configuration) from the folder that houses the subfolder with NameOfConfig, you get an error like this:  "Get-targetresource PS module does not implement the key property solution"
Solution:  Stop a specific process by running this command.
gps wmi* |? {$_.Modules.ModuleName -like '*DSC*'} | Stop-Process -Force
Re-run the "start-dscconfiguration NameOfConfig -wait -verbose" command.

Problem and Solution: “New Simple Volume” is Greyed Out After Disk Was Added To Windows Server

Goal:  You want to create a new Disk Partition on Windows Server.
Problem:  You go to Server Manager -> Computer Management -> Storage -> Disk Management.  You right click a newly-added partition (in the graphical bar section that says "Unallocated").  "New Simple Volume," "New Spanned Volume," and "New Striped Volume" are all grayed out.  
Solution:  Right click the "Disk X" (where X is the integer associated with the newly-added disk).  Choose "Online."  Right click the "Disk X" again.  Choose "Initialize Disk."  Now "New Simple Volume" should not be grayed out.

DSC Problem and Solution: One Way To Possibly Solve a “Cannot invoke the SendConfigurationApply” Problem

Goal:  You want to use DSC to apply a configuration.
Problem scenario:  When you run the "start-dscconfiguration NameOfConfig -wait -verbose" (where NameOfConfig is the name of the configuration) from the folder that houses the subfolder with NameOfConfig, you get an error like this: "DSC error: Cannot invoke the SendConfigurationApply method.  The sendConfigurationApply method is in progress..."
Solution: Back up and delete the subfolder named NameOfConfig.  You want to delete the .mof files. You'll need to recompile the configurations that are deleted.

How Do You List Directories Traits without Traversing into Their Contents?

Problem Scenario
You want to find out the permissions, ownership and groups associated with various subdirectories in Linux. You do not want to display the lengthy contents of these directories. How do you use the ls command to show the attributes of the directories themselves and not the contents of the directories?

Solution
From a Linux command prompt, run this command:  ls -ld /parentdirectory/

For PowerShell to list files without traversing into their contents use either of these two commands:
dir
ls